Я мог бы преобразовать их в списки и просто использовать регулярные циклы с индексами, но мне интересно, есть ли способ сделать это, что сохраняет их как IEnumerables.Есть ли способ сделать foreach для каждой пары элементов в 2 IEnumerable в C#?
ответ
По умолчанию нет никакого способа, но нетрудно добавить метод расширения, чтобы сделать его немного проще. Я исключил некоторые проверки ошибок, чтобы они были одинаковой длины для краткости.
public static void ForEachPair<T1,T2>(
this IEnumerable<T1> source1,
IEnumerable<T2> source2,
Action<T1,T2> del) {
using (var e1 = source1.GetEnumerator())
using (var e2 = source2.GetEnumerator()) {
while (e1.MoveNext() && e2.MoveNext()) {
del(e1.Current, e2.Current);
}
}
}
Теперь вы можете сделать следующее
var list = GetSomeList();
var otherList = GetSomeOtherList();
list.ForEachPair(otherList, (x,y) =>
{
// Loop code here
});
Я думаю, что вам нужна новая функция Zip из .NET 4.0. Eric Lippert blogged about it recently и включал простую форму реализации.
Это также в MoreLINQ, в Zip.cs, что позволяет использовать разные варианты, если последовательности не имеют одинаковой длины. «По умолчанию» должен действовать как .NET 4.0, останавливаясь, когда любая последовательность заканчивается из элементов. Альтернативы - это заполнить более короткую последовательность или выбросить исключение.
Право, это был один из вещей, которые я действительно любил о Python в течение недели или около того, что я играл с ним в том, что с Zip будучи встроенным в функции очень мало случаев, когда была необходима традиция для цикла, и они подчеркивали, что заставляя вас делать мини-хак, чтобы получить традиционный для поведения петли. Рад видеть, что он сделает это int C# 4 – Davy8
- 1. Печать суммы каждой пары векторных элементов - C++
- 2. Есть ли способ сделать в реальном времени ForEach в Firebase?
- 3. C++ Count возникновение каждой пары элементов в текстовом файле
- 4. Есть ли способ сделать currying в C?
- 5. Есть ли способ создать в цикле foreach?
- 6. Есть ли хороший способ разделить IEnumerable на 2 группы?
- 7. Есть ли удобный способ сделать «dictionary_only» в Objective-C?
- 8. Есть ли способ сделать клон в CSS?
- 9. Оптимизация алгоритма для каждой пары в массиве
- 10. Есть ли канонический способ «исправить» «динамический» IEnumerable?
- 11. Эффективный способ сделать две пары в python
- 12. Есть ли способ сделать List.addAll элементов сортировки нужно для поиска
- 13. Есть ли альтернативный способ избежать цикла Foreach?
- 14. Есть ли способ вырваться из цикла foreach?
- 15. Есть ли способ сделать это в python?
- 16. Есть ли способ «связать» несколько элементов?
- 17. Есть ли способ сделать это?
- 18. Есть ли лучший способ сделать это (C#)?
- 19. Есть ли другой способ просмотра пользовательских элементов управления в C#
- 20. Есть ли способ сделать JavaScript обязательным в Struts 2?
- 21. Получите процент людей для каждой пары
- 22. Лучший способ smush пары элементов массива вместе в Рубине
- 23. Есть ли способ имитировать foreach в Django с помощью запросов?
- 24. Расширение ArrayList и реализация IEnumerable - Есть ли лучший способ?
- 25. XSLT/Diazo: создать элемент для каждой пары элементов
- 26. C# Framework 2 DataTable для IEnumerable
- 27. Есть ли способ сделать это в Grails?
- 28. Boost способ моделирования C# IEnumerable?
- 29. Есть ли способ изменить переменную цикла foreach?
- 30. Есть ли лучший способ получить элементы разделенной пары в bash?
IMO, вы поняли это правильно, Zip - это что-то другое. – leppie
@ Jared: Я думаю, вы имели в виду, что ваш «если» должен быть «пока». @leppie: Каким образом это отличается от «Zip», кроме предоставления результата в виде IEnumerable (который вы затем можете использовать с foreach) вместо передачи делегата для выполнения? –
Полезная функция. Небольшое предложение: нет необходимости встраивать операторы using. – Noldorin