Как я могу получить доступ к следующему значению в наборе в цикле foreach в C#?

Я работаю в C# и с отсортированным List<T> из структур. Я пытаюсь выполнить итерации через List и для каждого повторения я хотел бы получить доступ к следующему члену списка. Существует ли способ сделать это?

Псевдопример кода:

foreach (Member member in List)
{
    Compare(member, member.next);
}
29
задан Peter Mortensen 9 March 2010 в 19:07
поделиться

5 ответов

Вы не можете. Вместо этого используйте вместо

for(int i=0; i<list.Count-1; i++)
   Compare(list[i], list[i+1]);
58
ответ дан 28 November 2019 в 00:47
поделиться

Вместо этого вы можете просто сохранить предыдущее значение:

T prev = default(T);
bool first = true;
foreach(T item in list) {
    if(first) {
        first = false;
    } else {
        Compare(prev, item);
    }
    prev = item;
}
19
ответ дан 28 November 2019 в 00:47
поделиться

Используйте обычный цикл for с индексом и сравните list[i] и list[i+1]. (Но убедитесь, что цикл выполняется только до предпоследнего индекса.)

Или, если вы действительно хотите использовать foreach, вы можете сохранить ссылку Member на предыдущий член и проверить его в следующий раз. Но я бы не рекомендовал этого делать.

3
ответ дан 28 November 2019 в 00:47
поделиться

LINQ может быть здесь вашим другом. Этот подход будет работать со всем, что есть IEnumerable , а не только с коллекциями IList , что очень полезно, если ваша коллекция никогда не заканчивается или иным образом рассчитывается на лету:

class Program {
    static void Main(string[] args) {
        var list = new List<Int32> { 1, 2, 3, 4, 5 };
        foreach (var comparison in list.Zip(list.Skip(1), Compare)) {
            Console.WriteLine(comparison);
        }
        Console.ReadKey();
    }

    static Int32 Compare(Int32 first, Int32 second) {
        return first - second;
    }
}
3
ответ дан 28 November 2019 в 00:47
поделиться

Если бы кто-то был так склонен, вы, вероятно, могли бы написать метод Extension и для этого...

public static void ForEachNext<T>(this IList<T> collection, Action<T, T> func)
{
    for (int i = 0; i < collection.Count - 1; i++)
        func(collection[i], collection[i + 1]);
}

Использование:

List<int> numList = new List<int> { 1, 3, 5, 7, 9, 11, 13, 15 };

numList.ForEachNext((first, second) => 
{
    Console.WriteLine(string.Format("{0}, {1}", first, second));
});
5
ответ дан 28 November 2019 в 00:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: