2009-05-16 1 views

ответ

5

По умолчанию нет никакого способа, но нетрудно добавить метод расширения, чтобы сделать его немного проще. Я исключил некоторые проверки ошибок, чтобы они были одинаковой длины для краткости.

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 
}); 
+0

IMO, вы поняли это правильно, Zip - это что-то другое. – leppie

+0

@ Jared: Я думаю, вы имели в виду, что ваш «если» должен быть «пока». @leppie: Каким образом это отличается от «Zip», кроме предоставления результата в виде IEnumerable (который вы затем можете использовать с foreach) вместо передачи делегата для выполнения? –

+0

Полезная функция. Небольшое предложение: нет необходимости встраивать операторы using. – Noldorin

6

Я думаю, что вам нужна новая функция Zip из .NET 4.0. Eric Lippert blogged about it recently и включал простую форму реализации.

Это также в MoreLINQ, в Zip.cs, что позволяет использовать разные варианты, если последовательности не имеют одинаковой длины. «По умолчанию» должен действовать как .NET 4.0, останавливаясь, когда любая последовательность заканчивается из элементов. Альтернативы - это заполнить более короткую последовательность или выбросить исключение.

+0

Право, это был один из вещей, которые я действительно любил о Python в течение недели или около того, что я играл с ним в том, что с Zip будучи встроенным в функции очень мало случаев, когда была необходима традиция для цикла, и они подчеркивали, что заставляя вас делать мини-хак, чтобы получить традиционный для поведения петли. Рад видеть, что он сделает это int C# 4 – Davy8

Смежные вопросы