34

こんにちは、このようなことを行う方法があります:

for (int i = 0; i < Math.Min(a.Count, b.Count); i++)
{
    // Do stuff
    //a[i]
    //b[i]
}

Foreachで?

みたいな書き方がいいから

foreach(var item1 in list1 and var item2 in list2 /* ....*/)
{
   item1.use(item2);
}

編集

わかりました申し訳ありませんが、一部の人にとっては十分に明確ではなかったので、うまくいけばより良い説明です

List<classA> listA = fillListA();
List<classB> listB = fillListB();
//here could be infinity many lists of sometimes diffrent T types

forループで実行するのは好きではないので、ある種のForEachを実行したいと思います。

foreach(var item1 in list1 and var item2 in list2 /* and ...*/)
{
    item1.use(item2);
}

AFAIK私はそのようなキーワードクラスのものを変更することはできないので、 Parallel.ForEachのようにイテレータを構築してもいいと思ったForEach<TSource>(IEnumerable<TSource>, Action<TSource>) が、彼女はそれを実装する方法がわからないので立ち往生する

Static.ForEach<TSource>(IEnumerable<TSource>,IEnumerable<TSource>, ???Action<TSource,???>????)
4

4 に答える 4

29

私が考えることができる唯一のことは、タプルEnumerable.Zipと一緒です:

foreach(var tuple in list1.Zip(list2, Tuple.Create))
{
    tuple.Item1.use(tuple.Item2);
}

もちろん、 の代わりにuse、2 つの要素から 3 番目の値を生成する副作用のないメソッドがあれば、次のようにすることもできます。

var result = list1.Zip(list2, (item1, item2) => item1.ProduceObject(item2))
                  .ToList(); // if required
于 2013-08-23T06:14:58.237 に答える
4

Zipメソッドを使用できます(ただし、.net 4 以降でのみ使用可能)。

List<int> l4 = new List<int> { 1, 2, 3, 4 };
List<int> l5 = new List<int> { 5, 6, 7 };

var l4Andl5 = l4.Zip(l5, (l, m) => new { List1 = l, List2 = m });
foreach (var x in l4Andl5)
{


}
于 2013-08-23T06:22:10.220 に答える
3

リストの長さが同じ場合は、単純にローカル整数変数を使用することもできます。

List<classA> listA = fillListA();
List<classB> listB = fillListB();

var i = 0;
foreach(var itemA in listA)
{
    itemA.use(listB[i++]);
}
于 2016-01-19T18:57:34.840 に答える