我有两个长度相同的列表,是否可以一次循环这两个列表?
我正在寻找正确的语法来执行以下操作
foreach itemA, itemB in ListA, ListB { Console.WriteLine(itemA.ToString()+","+itemB.ToString()); }
你认为这在C#中有可能吗?如果是的话,lambda表达式与此相当的是什么?
[编辑]:澄清; 这在通用LINQ/IEnumerable
context中非常有用,在这种情况下你不能使用索引器,因为a:它不存在于可枚举中,而b:你不能保证你可以多次读取数据.由于OP提到了lambdas,所以LINQ可能不会太远(是的,我确实意识到LINQ和lambdas不是完全相同的事情).
听起来你需要缺少的Zip
操作员; 你可以欺骗它:
static void Main() { int[] left = { 1, 2, 3, 4, 5 }; string[] right = { "abc", "def", "ghi", "jkl", "mno" }; // using KeyValuePair<,> approach foreach (var item in left.Zip(right)) { Console.WriteLine("{0}/{1}", item.Key, item.Value); } // using projection approach foreach (string item in left.Zip(right, (x,y) => string.Format("{0}/{1}", x, y))) { Console.WriteLine(item); } } // library code; written once and stuffed away in a util assembly... // returns each pais as a KeyValuePair<,> static IEnumerable> Zip ( this IEnumerable left, IEnumerable right) { return Zip(left, right, (x, y) => new KeyValuePair (x, y)); } // accepts a projection from the caller for each pair static IEnumerable Zip ( this IEnumerable left, IEnumerable right, Func selector) { using(IEnumerator leftE = left.GetEnumerator()) using (IEnumerator rightE = right.GetEnumerator()) { while (leftE.MoveNext() && rightE.MoveNext()) { yield return selector(leftE.Current, rightE.Current); } } }
相反,在一个普通的旧循环中做它会简单得多......
for(int i=0; i
区别在于您只需要一次*的Zip扩展方法*,您可以永久重用它.此外,它将适用于任何序列而不仅仅是列表.
我被Jon Skeet羞辱了:(
3> 小智..:你可以明确地做到这一点.
IEnumerator ListAEnum = ListA.GetEnumerator(); IEnumerator ListBEnum = ListB.GetEnumerator(); ListBEnum.MoveNext(); while(ListAEnum.MoveNext()==true) { itemA=ListAEnum.getCurrent(); itemB=ListBEnum.getCurrent(); Console.WriteLine(itemA.ToString()+","+itemB.ToString()); }至少这个(或类似的东西)是编译器为foreach循环所做的事情.我没有测试它,我猜测枚举器缺少一些模板参数.
只需从List和IEnumerator-Interface中查找GetEnumerator().