Как получить индекс текущей итерации цикла foreach?

Есть ли в C# какая-нибудь редкая языковая 9X_.cs-file конструкция, с которой я не сталкивался 9X_c#-language (например, те немногие, с которыми я недавно 9X_c#-language познакомился, например, на Stack Overflow) для 9X_c#-language получения значения, представляющего текущую 9X_foreach итерацию цикла foreach?

Например, сейчас 9X_c#.net я делаю что-то подобное в зависимости от 9X_c-sharp обстоятельств:

int i = 0;
foreach (Object o in collection)
{
    // ...
    i++;
}

1200
5

  • foreach также позволяет компилятору пропускать границы, проверяя каждый доступ к массиву в скомпилированном коде. Исп ...
32
Общее количество ответов: 32

Ответ #1

Ответ на вопрос: Как получить индекс текущей итерации цикла foreach?

Ян Мерсер опубликовал подобное решение на 9X_.cs-file Phil Haack's blog:

foreach (var item in Model.Select((value, i) => new { i, value }))
{
    var value = item.value;
    var index = item.i;
}

Это дает вам элемент (item.value) и его индекс (item.i) с 9X_c# помощью this overload of LINQ's Select:

второй параметр функции [внутри 9X_foreach-loop Select] представляет индекс исходного элемента.

new { i, value } создает 9X_visual-c# новый anonymous object.

Выделения кучи можно избежать, используя 9X_c# ValueTuple, если вы используете C# 7.0 или новее:

foreach (var item in Model.Select((value, i) => ( value, i )))
{
    var value = item.value;
    var index = item.i;
}

Вы 9X_c-sharp также можете удалить item., используя автоматическое 9X_.cs-file деструктурирование:

    foreach ((MyType value, Int32 i) in Model.Select((value, i) => ( value, i ))) {
  1. @value
  2. }

884
9

  • чистая классность, но где это задокументировано .... Я имею в виду два параметра в делегате Select, я никогда этого не видел ... и я не могу найти объяснение в документации ... экспериментируя с этим выражением, я увидел это значение ничего не зна ...

Ответ #2

Ответ на вопрос: Как получить индекс текущей итерации цикла foreach?

foreach предназначен для перебора коллекций, реализующих 9X_.cs-file IEnumerable. Он делает это, вызывая GetEnumerator для коллекции, которая 9X_c#-language возвращает Enumerator.

Этот перечислитель имеет метод 9X_c#-language и свойство:

  • MoveNext()
  • Current

Current возвращает объект, на котором 9X_c# Enumerator в данный момент находится, MoveNext обновляет 9X_foreach Current на следующий объект.

Концепция индекса чужда 9X_c#-language концепции перечисления и не может быть реализована.

Из-за 9X_c-sharp этого большинство коллекций можно просматривать 9X_csharp с помощью индексатора и конструкции цикла 9X_c#.net for.

В этой ситуации я предпочитаю использовать 9X_c#.net цикл for, а не отслеживать индекс с помощью 9X_csharp локальной переменной.

635
9

  • Суть в том, что «Связанный список - это пример IEnumerable, у которого нет индекса» ...

Ответ #3

Ответ на вопрос: Как получить индекс текущей итерации цикла foreach?

Наконец, C# 7 имеет достойный синтаксис 9X_c#.net для получения индекса внутри цикла foreach (т.е. кортежи):

foreach (var (item, index) in collection.WithIndex())
{
    Debug.WriteLine($"{index}: {item}");
}

Потребуется 9X_enhanced-for-loop небольшой метод расширения:

public static IEnumerable<(T item, int index)> WithIndex(this IEnumerable self)       
   => self.Select((item, index) => (item, index)); 

398
6

  • Было бы полезно вызвать метод Enumerated, чтобы он был более узнаваемым для людей, привыкших к [другим языкам] (https://developer.apple.com/documentation/swift/array/1687832-enumerated) (и, возможно, поменять порядок парамет ...

Ответ #4

Ответ на вопрос: Как получить индекс текущей итерации цикла foreach?

Можно сделать что-то вроде этого:

public static class ForEachExtensions
{
    public static void ForEachWithIndex(this IEnumerable enumerable, Action handler)
    {
        int idx = 0;
        foreach (T item in enumerable)
            handler(item, idx++);
    }
}

public class Example
{
    public static void Main()
    {
        string[] values = new[] { "foo", "bar", "baz" };

        values.ForEachWithIndex((item, idx) => Console.WriteLine("{0}: {1}", idx, item));
    }
}

9X_c#.net

125
2

  • Ваш вызов ForEachWithIndex эквивалентен этому вызову с использованием Linq Select, который принимает строку и индекс: `values.Select ((item, idx) => {Console.WriteLine (" {0}: {1} ", ...

Ответ #5

Ответ на вопрос: Как получить индекс текущей итерации цикла foreach?

Я не согласен с комментариями о том, что 9X_c#-language в большинстве случаев лучше использовать 9X_.cs-file цикл for.

foreach - полезная конструкция, которую нельзя 9X_c-sharp заменить циклом for ни при каких обстоятельствах.

Например, если 9X_csharp у вас есть DataReader и вы просматриваете все записи 9X_foreach в цикле с помощью foreach, он автоматически вызывает 9X_foreach метод Dispose и закрывает считыватель (который 9X_foreach затем может закрыть соединение автоматически). Таким 9X_foreach образом, это безопаснее, поскольку предотвращает 9X_c# утечку соединения, даже если вы забыли закрыть 9X_c#.net считыватель.

(Конечно, это хорошая практика 9X_csharp - всегда закрывать читатели, но компилятор 9X_.cs-file не поймает это, если вы этого не сделаете 9X_c-sharp - вы не можете гарантировать, что закрыли 9X_enhanced-for-loop все читатели, но вы можете сделать это с 9X_foreach большей вероятностью, что не будет утечки 9X_c-sharp подключений, привыкнув использовать foreach.)

Могут 9X_foreach быть и другие примеры полезного неявного 9X_c#.net вызова метода Dispose.

113
1

  • Спасибо за указание на это. Довольно тонкий. Дополнительную информацию можно получить на http://www.pvle.be/2010/05/foreach-statement-calls-dispose-on-ienu ...

Ответ #6

Ответ на вопрос: Как получить индекс текущей итерации цикла foreach?

Дословный ответ — предупреждение, производительность 9X_enhanced-for-loop может быть не такой хорошей, как простое 9X_c# использование int для отслеживания индекса. По 9X_c#.net крайней мере, это лучше, чем использовать 9X_c-sharp IndexOf.

Вам просто нужно использовать перегруженную 9X_foreach индексацию Select, чтобы обернуть каждый 9X_foreach-loop элемент в коллекции анонимным объектом, который 9X_c-sharp знает индекс. Это можно сделать против всего, что 9X_visual-c# реализует IEnumerable.

System.Collections.IEnumerable collection = Enumerable.Range(100, 10);

foreach (var o in collection.OfType().Select((x, i) => new {x, i}))
{
    Console.WriteLine("{0} {1}", o.i, o.x);
}

68
2

  • Единственная причина использовать OfType <t>() вместо Cast <t>() заключается в том, ч ...

Ответ #7

Ответ на вопрос: Как получить индекс текущей итерации цикла foreach?

Используя LINQ, C# 7 и пакет NuGet System.ValueTuple, вы 9X_c#.net можете сделать следующее:

foreach (var (value, index) in collection.Select((v, i)=>(v, i))) {
    Console.WriteLine(value + " is at index " + index);
}

Вы можете использовать 9X_visual-c# обычную конструкцию foreach и иметь возможность 9X_visual-c# напрямую обращаться к значению и индексу, а 9X_foreach не как член объекта, и сохранять оба поля 9X_.cs-file только в пределах цикла. По этим причинам 9X_visual-c# я считаю, что это лучшее решение, если вы 9X_enhanced-for-loop можете использовать C# 7 и System.ValueTuple.

52
1

  • Это другое дело, потому что .Select встроен в LINQ. Вам не нужно писать свою собственную функцию? Однако вам нужно будет установить VS "System.Va ...

Ответ #8

Ответ на вопрос: Как получить индекс текущей итерации цикла foreach?

Нет ничего плохого в использовании переменной 9X_foreach-loop счетчика. Фактически, независимо от того, используете 9X_c#.net ли вы for, foreach while или do, переменная счетчика должна 9X_.cs-file быть где-то объявлена ​​и увеличена.

Поэтому 9X_c#.net используйте эту идиому, если вы не уверены, что 9X_c# у вас есть соответствующая проиндексированная 9X_foreach коллекция:

var i = 0;
foreach (var e in collection) {
   // Do stuff with 'e' and 'i'
   i++;
}

Иначе используйте этот, если вы 9X_c# знаете, что ваша индексируемая коллекция - O (1) для доступа 9X_c#.net к индексу (что будет для Array и, вероятно, для 9X_foreach-loop List (в документации не сказано), но не обязательно 9X_enhanced-for-loop для других типов (например, LinkedList)):

// Hope the JIT compiler optimises read of the 'Count' property!
for (var i = 0; i < collection.Count; i++) {
   var e = collection[i];
   // Do stuff with 'e' and 'i'
}

Никогда не 9X_c#.net должно быть необходимости «вручную» управлять 9X_foreach IEnumerator, вызывая MoveNext() и запрашивая Current - foreach избавляет вас 9X_c#.net от этой конкретной проблемы ... если вам 9X_csharp нужно пропустить элементы, просто используйте 9X_c-sharp continue в теле цикла.

И просто для полноты, в зависимости 9X_c-sharp от того, что вы делали со своим индексом (приведенные 9X_foreach выше конструкции предлагают большую гибкость), вы 9X_c# можете использовать Parallel LINQ:

// First, filter 'e' based on 'i',
// then apply an action to remaining 'e'
collection
    .AsParallel()
    .Where((e,i) => /* filter with e,i */)
    .ForAll(e => { /* use e, but don't modify it */ });

// Using 'e' and 'i', produce a new collection,
// where each element incorporates 'i'
collection
    .AsParallel()
    .Select((e, i) => new MyWrapper(e, i));

Мы используем 9X_csharp AsParallel() выше, потому что уже 2014 год, и мы хотим 9X_.cs-file эффективно использовать эти несколько ядер, чтобы 9X_.cs-file ускорить процесс. Кроме того, для «последовательного» LINQ, you only get a ForEach() extension method on List and Array ... и 9X_c#-language непонятно, лучше ли его использовать, чем 9X_c#-language простой foreach, поскольку вы все еще используете 9X_enhanced-for-loop однопоточную схему для более уродливого 9X_enhanced-for-loop синтаксиса.

44
0

Ответ #9

Ответ на вопрос: Как получить индекс текущей итерации цикла foreach?

Используя ответ @ FlySwat, я придумал следующее 9X_csharp решение:

//var list = new List { 1, 2, 3, 4, 5, 6 }; // Your sample collection

var listEnumerator = list.GetEnumerator(); // Get enumerator

for (var i = 0; listEnumerator.MoveNext() == true; i++)
{
  int currentItem = listEnumerator.Current; // Get current item.
  //Console.WriteLine("At index {0}, item is {1}", i, currentItem); // Do as you wish with i and  currentItem
}

Вы получаете перечислитель с помощью 9X_enhanced-for-loop GetEnumerator, а затем выполняете цикл с помощью цикла 9X_c-sharp for. Однако хитрость заключается в том, чтобы 9X_foreach сделать условие цикла listEnumerator.MoveNext() == true.

Поскольку метод перечислителя 9X_visual-c# MoveNext возвращает истину, если есть следующий 9X_csharp элемент и к нему можно получить доступ, условие 9X_foreach-loop цикла останавливает цикл, когда у нас заканчиваются 9X_.cs-file элементы для перебора.

37
5

  • Нет необходимости сравнивать listEnumerator.MoveNext() == true. Э ...

Ответ #10

Ответ на вопрос: Как получить индекс текущей итерации цикла foreach?

Просто добавьте свой индекс. Будьте проще.

int i = 0;
foreach (var item in Collection)
{
    item.index = i;
    ++i;
}

9X_foreach

26
0

Ответ #11

Ответ на вопрос: Как получить индекс текущей итерации цикла foreach?

Вы можете заключить исходный перечислитель 9X_csharp в другой, который действительно содержит 9X_c# информацию об индексе.

foreach (var item in ForEachHelper.WithIndex(collection))
{
    Console.Write("Index=" + item.Index);
    Console.Write(";Value= " + item.Value);
    Console.Write(";IsLast=" + item.IsLast);
    Console.WriteLine();
}

Вот код класса ForEachHelper.

public static class ForEachHelper
{
    public sealed class Item
    {
        public int Index { get; set; }
        public T Value { get; set; }
        public bool IsLast { get; set; }
    }

    public static IEnumerable> WithIndex(IEnumerable enumerable)
    {
        Item item = null;
        foreach (T value in enumerable)
        {
            Item next = new Item();
            next.Index = 0;
            next.Value = value;
            next.IsLast = false;
            if (item != null)
            {
                next.Index = item.Index + 1;
                yield return item;
            }
            item = next;
        }
        if (item != null)
        {
            item.IsLast = true;
            yield return item;
        }            
    }
}

25
1

  • @Lucas: Нет, но он вернет индекс текущей итерации foreach. Во ...

Ответ #12

Ответ на вопрос: Как получить индекс текущей итерации цикла foreach?

Вот решение, которое я только что придумал 9X_.cs-file для этой проблемы

Исходный код:

int index=0;
foreach (var item in enumerable)
{
    blah(item, index); // some code that depends on the index
    index++;
}

Обновленный код

enumerable.ForEach((item, index) => blah(item, index));

Метод расширения:

    public static IEnumerable ForEach(this IEnumerable enumerable, Action action)
    {
        var unit = new Unit(); // unit is a new type from the reactive framework (http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx) to represent a void, since in C# you can't return a void
        enumerable.Select((item, i) => 
            {
                action(item, i);
                return unit;
            }).ToList();

        return pSource;
    }

21
0

Ответ #13

Ответ на вопрос: Как получить индекс текущей итерации цикла foreach?

Почему именно foreach?!

Самый простой способ - использовать for вместо 9X_foreach foreach , если вы используете List:

for (int i = 0 ; i < myList.Count ; i++)
{
    // Do something...
}

Или, если вы хотите использовать 9X_c# foreach:

foreach (string m in myList)
{
     // Do something...
}

Вы можете использовать это, чтобы 9X_c# узнать индекс каждого цикла:

myList.indexOf(m)

19
3

  • Проблема, которую следует избегать, заключается в том, когда вы проходите IEnumerable несколько раз, например чтобы получить количество элементов, а ...

Ответ #14

Ответ на вопрос: Как получить индекс текущей итерации цикла foreach?

C# 7 наконец-то дает нам элегантный способ 9X_c#-language сделать это:

static class Extensions
{
    public static IEnumerable<(int, T)> Enumerate(
        this IEnumerable input,
        int start = 0
    )
    {
        int i = start;
        foreach (var t in input)
        {
            yield return (i++, t);
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        var s = new string[]
        {
            "Alpha",
            "Bravo",
            "Charlie",
            "Delta"
        };

        foreach (var (i, t) in s.Enumerate())
        {
            Console.WriteLine($"{i}: {t}");
        }
    }
}

19
0

Ответ #15

Ответ на вопрос: Как получить индекс текущей итерации цикла foreach?

Это будет работать только для списка, а 9X_foreach не для любого IEnumerable, но в LINQ есть 9X_foreach это:

IList collection = new List { 
    new Object(), 
    new Object(), 
    new Object(), 
    };

foreach (Object o in collection)
{
    Console.WriteLine(collection.IndexOf(o));
}

Console.ReadLine();

@Jonathan Я не сказал, что это отличный 9X_c-sharp ответ, я просто сказал, что он просто показывает, что 9X_visual-c# можно сделать то, что он просил :)

@Graphain 9X_foreach-loop Я бы не ожидал, что он будет быстрым - я 9X_enhanced-for-loop не совсем уверен, как он работает, он может 9X_c#.net каждый раз повторять весь список, чтобы 9X_foreach найти соответствующий объект, что было бы 9X_enhanced-for-loop чертовски много сравнений.

Тем не менее, List 9X_visual-c# может хранить индекс каждого объекта вместе 9X_foreach со счетчиком.

У Джонатана, кажется, есть 9X_csharp идея получше, если он уточнит?

Было бы лучше 9X_csharp просто вести подсчет того, где вы находитесь 9X_enhanced-for-loop в foreach, хотя это проще и адаптируемее.

18
2

  • Другая проблема заключается в том, что это ...

Ответ #16

Ответ на вопрос: Как получить индекс текущей итерации цикла foreach?

Этот ответ: лоббируйте языковую группу C# для 9X_.cs-file прямой языковой поддержки.

Первый ответ гласит:

Очевидно, что 9X_foreach понятие индекса чуждо концепции перечисление 9X_foreach и не может быть выполнено.

Хотя это верно 9X_c#.net для текущей версии языка C# (2020), это 9X_visual-c# не концептуальное ограничение CLR / языка, это 9X_visual-c# можно сделать.

Команда разработчиков языка 9X_c#-language Microsoft C# могла бы создать новую функцию 9X_visual-c# языка C#, добавив поддержку нового интерфейса 9X_foreach-loop IIndexedEnumerable

foreach (var item in collection with var index)
{
    Console.WriteLine("Iteration {0} has value {1}", index, item);
}

//or, building on @user1414213562's answer
foreach (var (item, index) in collection)
{
    Console.WriteLine("Iteration {0} has value {1}", index, item);
}

Если используется foreach () и присутствует 9X_visual-c# with var index, то компилятор ожидает, что коллекция элементов 9X_c#-language объявит интерфейс IIndexedEnumerable. Если интерфейс отсутствует, компилятор 9X_.cs-file может полифиллом обернуть источник объектом 9X_c-sharp IndexedEnumerable, который добавляет в код 9X_.cs-file для отслеживания индекса.

interface IIndexedEnumerable : IEnumerable
{
    //Not index, because sometimes source IEnumerables are transient
    public long IterationNumber { get; }
}

Позже среда CLR 9X_.cs-file может быть обновлена, чтобы иметь внутреннее 9X_c-sharp отслеживание индекса, которое используется 9X_foreach-loop только в том случае, если указано ключевое 9X_c-sharp слово with и источник не реализует напрямую 9X_c-sharp IIndexedEnumerable

Почему:

  • Foreach выглядит лучше, а в бизнес-приложениях циклы foreach редко являются узким местом производительности.
  • Foreach может более эффективно использовать память. Наличие конвейера функций вместо преобразования в новые коллекции на каждом этапе. Кого волнует, использует ли он несколько больше циклов ЦП, когда меньше отказов кеш-памяти ЦП и меньше сборок мусора?
  • Требование от кодировщика добавить код отслеживания индекса портит красоту
  • Его довольно легко реализовать (пожалуйста, Microsoft), и он обратно совместим.

Хотя большинство людей здесь не являются 9X_c#-language сотрудниками Microsoft, это правильный 9X_csharp ответ, вы можете лоббировать Microsoft, чтобы 9X_foreach-loop добавить такую ​​функцию. Вы уже можете 9X_c# создать свой собственный итератор с extension function and use tuples, но 9X_c#-language Microsoft может добавить синтаксический 9X_c#-language сахар, чтобы избежать функции расширения

17
1

  • @Pavel Я обновил ответ, чтобы было понятно. Этот ответ был дан, чтобы опровергнуть основной ответ, который гласит: «Очевидно, что концепция индекса чуждо концепции пер ...

Ответ #17

Ответ на вопрос: Как получить индекс текущей итерации цикла foreach?

Я делаю это так, что приятно своей простотой 9X_enhanced-for-loop / краткостью, но если вы много делаете в 9X_c-sharp теле цикла obj.Value, он довольно быстро устареет.

foreach(var obj in collection.Select((item, index) => new { Index = index, Value = item }) {
    string foo = string.Format("Something[{0}] = {1}", obj.Index, obj.Value);
    ...
}

10
0

Ответ #18

Ответ на вопрос: Как получить индекс текущей итерации цикла foreach?

int index;
foreach (Object o in collection)
{
    index = collection.indexOf(o);
}

Это будет работать для коллекций, поддерживающих 9X_c#-language IList.

7
4

  • Не используйте этот ответ, я нашел твердую правду, упомянутую в одном из комментарие ...

Ответ #19

Ответ на вопрос: Как получить индекс текущей итерации цикла foreach?

//using foreach loop how to get index number:
    
foreach (var result in results.Select((value, index) => new { index, value }))
    {
     //do something
    }

9X_c#-language

7
2

  • Хотя этот код может ответить на вопрос, предоставлени ...

Ответ #20

Ответ на вопрос: Как получить индекс текущей итерации цикла foreach?

Лучше использовать ключевое слово continue безопасную 9X_c# конструкцию, подобную этой

int i=-1;
foreach (Object o in collection)
{
    ++i;
    //...
    continue; //<--- safe to call, index will be increased
    //...
}

6
0

Ответ #21

Ответ на вопрос: Как получить индекс текущей итерации цикла foreach?

Вы можете написать свой цикл следующим образом:

var s = "ABCDEFG";
foreach (var item in s.GetEnumeratorWithIndex())
{
    System.Console.WriteLine("Character: {0}, Position: {1}", item.Value, item.Index);
}

После 9X_.cs-file добавления следующей структуры и метода 9X_foreach-loop расширения.

Структура и метод расширения 9X_foreach инкапсулируют функциональность Enumerable.Select.

public struct ValueWithIndex
{
    public readonly T Value;
    public readonly int Index;

    public ValueWithIndex(T value, int index)
    {
        this.Value = value;
        this.Index = index;
    }

    public static ValueWithIndex Create(T value, int index)
    {
        return new ValueWithIndex(value, index);
    }
}

public static class ExtensionMethods
{
    public static IEnumerable> GetEnumeratorWithIndex(this IEnumerable enumerable)
    {
        return enumerable.Select(ValueWithIndex.Create);
    }
}

5
0

Ответ #22

Ответ на вопрос: Как получить индекс текущей итерации цикла foreach?

Если коллекция представляет собой список, вы 9X_c# можете использовать List.IndexOf, например:

foreach (Object o in collection)
{
    // ...
    @collection.IndexOf(o)
}

4
3

  • А теперь алгоритм O (n ^ 2) (если не хуже). Я бы очень хорошо подумал, прежде чем использовать это. Это также дубликат ответа ...

Ответ #23

Ответ на вопрос: Как получить индекс текущей итерации цикла foreach?

Для интереса Фил Хаак только что написал 9X_c#.net пример этого в контексте Razor Templated 9X_c-sharp Delegate (http://haacked.com/archive/2011/04/14/a-better-razor-foreach-loop.aspx)

Фактически он пишет метод расширения, который 9X_.cs-file оборачивает итерацию в класс «IteratedItem» (см. ниже), предоставляя 9X_c#-language доступ как к индексу, так и к элементу во 9X_c#.net время итерации.

public class IndexedItem {
  public IndexedItem(int index, TModel item) {
    Index = index;
    Item = item;
  }

  public int Index { get; private set; }
  public TModel Item { get; private set; }
}

Однако, хотя это было бы 9X_visual-c# нормально в среде, отличной от Razor, если 9X_c#-language вы выполняете одну операцию (т. е. ту, которая 9X_c#.net может быть предоставлена ​​как лямбда), это 9X_c-sharp не будет надежной заменой синтаксиса for 9X_c#.net / foreach в non-Razor. -Razor контексты.

3
0

Ответ #24

Ответ на вопрос: Как получить индекс текущей итерации цикла foreach?

Мое решение этой проблемы - метод расширения 9X_.cs-file WithIndex(),

http://code.google.com/p/ub-dotnet-utilities/source/browse/trunk/Src/Utilities/Extensions/EnumerableExtensions.cs

Используйте это как

var list = new List { 1, 2, 3, 4, 5, 6 };    

var odd = list.WithIndex().Where(i => (i.Item & 1) == 1);
CollectionAssert.AreEqual(new[] { 0, 2, 4 }, odd.Select(i => i.Index));
CollectionAssert.AreEqual(new[] { 1, 3, 5 }, odd.Select(i => i.Item));

3
0

Ответ #25

Ответ на вопрос: Как получить индекс текущей итерации цикла foreach?

Я не думаю, что это должно быть достаточно 9X_c# эффективным, но это работает:

@foreach (var banner in Model.MainBanners) {
    @Model.MainBanners.IndexOf(banner)
}

3
0

Ответ #26

Ответ на вопрос: Как получить индекс текущей итерации цикла foreach?

Я построил это в LINQPad:

var listOfNames = new List(){"John","Steve","Anna","Chris"};

var listCount = listOfNames.Count;

var NamesWithCommas = string.Empty;

foreach (var element in listOfNames)
{
    NamesWithCommas += element;
    if(listOfNames.IndexOf(element) != listCount -1)
    {
        NamesWithCommas += ", ";
    }
}

NamesWithCommas.Dump();  //LINQPad method to write to console.

Вы также можете просто 9X_csharp использовать string.join:

var joinResult = string.Join(",", listOfNames);

3
1

  • Может кто-нибудь объяснить мне, ...

Ответ #27

Ответ на вопрос: Как получить индекс текущей итерации цикла foreach?

У меня только что возникла эта проблема, но 9X_foreach-loop обдумывание проблемы в моем случае дало 9X_foreach-loop лучшее решение, не связанное с ожидаемым 9X_csharp решением.

Это может быть довольно распространенный 9X_.cs-file случай, в основном, я читаю из одного исходного 9X_foreach списка и создаю на их основе объекты в целевом 9X_foreach списке, однако мне нужно сначала проверить, действительны 9X_.cs-file ли исходные элементы, и я хочу вернуть строка 9X_csharp любой ошибки. На первый взгляд, я хочу получить 9X_.cs-file индекс в перечислителе объекта в свойстве 9X_enhanced-for-loop Current, однако, копируя эти элементы, я 9X_csharp в любом случае неявно знаю текущий индекс 9X_foreach-loop из текущего места назначения. Очевидно, это 9X_enhanced-for-loop зависит от вашего целевого объекта, но для 9X_foreach-loop меня это был список, и, скорее всего, он 9X_visual-c# будет реализовывать ICollection.

т.е.

var destinationList = new List();
foreach (var item in itemList)
{
  var stringArray = item.Split(new char[] { ';', ',' }, StringSplitOptions.RemoveEmptyEntries);

  if (stringArray.Length != 2)
  {
    //use the destinationList Count property to give us the index into the stringArray list
    throw new Exception("Item at row " + (destinationList.Count + 1) + " has a problem.");
  }
  else
  {
    destinationList.Add(new someObject() { Prop1 = stringArray[0], Prop2 = stringArray[1]});
  }
}

Не всегда 9X_c# применимо, но, я думаю, достаточно часто, чтобы 9X_foreach о нем стоило упомянуть.

В любом случае, дело 9X_visual-c# в том, что иногда в вашей логике уже есть 9X_c#.net неочевидное решение ...

2
0

Ответ #28

Ответ на вопрос: Как получить индекс текущей итерации цикла foreach?

Если ваша коллекция не может вернуть индекс 9X_c# объекта каким-либо методом, единственный 9X_.cs-file способ — использовать счетчик, как в вашем 9X_enhanced-for-loop примере.

Однако при работе с индексами единственным 9X_.cs-file разумным решением проблемы является использование 9X_c#.net цикла for. Все остальное усложняет код, не 9X_foreach говоря уже о временной и пространственной 9X_.cs-file сложности.

2
0

Ответ #29

Ответ на вопрос: Как получить индекс текущей итерации цикла foreach?

Таким образом, вы можете использовать индекс 9X_c# и значение с помощью LINQ:

ListValues.Select((x, i) => new { Value = x, Index = i }).ToList().ForEach(element =>
    {
        // element.Index
        // element.Value

    });

2
0

Ответ #30

Ответ на вопрос: Как получить индекс текущей итерации цикла foreach?

Я не верю, что есть способ получить значение 9X_.cs-file текущей итерации цикла foreach. Считать 9X_c# себя, кажется, лучший способ.

Могу я спросить, почему 9X_enhanced-for-loop вы хотели бы знать?

Кажется, что вы, скорее 9X_c#-language всего, будете делать одну из трех вещей:

1) Получение 9X_c# предмета из коллекции, но в данном случае 9X_csharp он у вас уже есть.

2) Подсчет объектов для 9X_foreach последующей обработки... у коллекций есть 9X_c-sharp свойство Count, которое вы могли бы использовать.

3) Установка 9X_c#.net свойства объекта на основе его порядка в 9X_enhanced-for-loop цикле... хотя вы могли бы легко установить 9X_c-sharp это при добавлении объекта в коллекцию.

2
0

Ответ #31

Ответ на вопрос: Как получить индекс текущей итерации цикла foreach?

Я не понял, что вы пытались сделать с информацией 9X_c#.net индекса, основываясь на вопросе. Однако 9X_.cs-file в C# вы обычно можете адаптировать метод 9X_c#-language IEnumerable.Select, чтобы получить индекс 9X_enhanced-for-loop из того, что вы хотите. Например, я могу 9X_c#.net использовать что-то подобное, чтобы определить, четное 9X_csharp или нечетное значение.

string[] names = { "one", "two", "three" };
var oddOrEvenByName = names
    .Select((name, index) => new KeyValuePair(name, index % 2))
    .ToDictionary(kvp => kvp.Key, kvp => kvp.Value);

Это даст вам словарь 9X_visual-c# по названию того, был ли элемент в списке 9X_c#-language нечетным (1) или четным (0).

2
0

Ответ #32

Ответ на вопрос: Как получить индекс текущей итерации цикла foreach?

Как насчет этого? Обратите внимание, что 9X_enhanced-for-loop myDelimitedString может иметь значение null, если 9X_.cs-file myEnumerable пусто.

IEnumerator enumerator = myEnumerable.GetEnumerator();
string myDelimitedString;
string current = null;

if( enumerator.MoveNext() )
    current = (string)enumerator.Current;

while( null != current)
{
    current = (string)enumerator.Current; }

    myDelimitedString += current;

    if( enumerator.MoveNext() )
        myDelimitedString += DELIMITER;
    else
        break;
}

1
1

  • Здесь множество проблем. А) допо ...