Есть ли способ сделать foreach для каждой пары элементов в 2 IEnumerable в C #? - PullRequest
2 голосов
/ 17 мая 2009

Я мог бы преобразовать их в списки и просто использовать обычный цикл for с индексами, но мне интересно, есть ли способ сделать это, чтобы они оставались как IEnumerables.

Ответы [ 2 ]

6 голосов
/ 17 мая 2009

Я думаю, вы хотите новую функцию Zip от .NET 4.0. Эрик Липперт недавно написал об этом в блоге и включил простую форму реализации.

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

5 голосов
/ 17 мая 2009

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

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
});
...