Zip 扩展方法 - Dotnet 4.0






2.63/5 (16投票s)
本文将介绍 ZIP 扩展方法的一些功能。
引言
C#4.0 引入了新的 Zip 扩展方法。
目的
使用指定的谓词函数合并两个序列。
签名
public static IEnumerableZip ( this IEnumerable first , IEnumerable second , Func resultSelector );
关于参数说明
first: 要合并的第一个序列。
second: 要合并的第二个序列。
resultSelector: 一个函数,用于指定如何合并两个序列的元素。
返回值: 一个 System.Collections.Generic.IEnumerable
使用代码
让我们看一些例子
示例输入
Listx = new List { 10, 20, 30, 40 }; List y = new List { 1, 2, 3, 4 };
目标
执行 x[i] * y[i]
期望输出
方法 1:传统的 For 循环
int itemCount = x.Count; for (int i = 0; i < itemCount; i++) Console.WriteLine(x[i] * y[i]); Console.ReadKey(true);
解释
首先,我们记录项目数量(这里是 4)。然后,我们从各自的位置获取项目并进行相乘。
方法 2:使用 Foreach 循环
foreach(int i in x) { foreach (int j in y) { Console.WriteLine(i * j); y.Remove(j); break; } }
解释
在这里,我们在外部 foreach 循环中从 x 列表中获取项目。然后在内部循环中,我们从 y 列表中获取项目。然后将项相乘并从 y 列表中删除它们。由于在执行乘法时应匹配项目索引,因此我们需要 break 语句。
方法 3:使用框架 3.5 的扩展方法
Enumerable.Range(0, x.Count) .Select(i => x[i] * y[i]) .ToList() .ForEach(i=>Console.WriteLine(i));
解释
Enumerable.Range 方法生成指定范围内(这里是 0 到 x.Count,即 4)的整数序列。然后使用 Select 方法将序列的每个元素投影到新的形式,并使用 Foreach 扩展方法对每个元素执行显示操作。
方法 4:使用框架 4.0 的 Zip 扩展方法
x.Zip(y, (a, b) => a * b) .ToList() .ForEach(i => Console.WriteLine(i));
解释
我们使用谓词函数合并两个序列,并使用 Foreach 扩展方法对每个元素执行显示操作。
扩展方法的另一个特点是,它会考虑最短的源进行迭代。
例如:
让我们以以下来源为例
ListX = new List { 10, 20, 30 }; //Element 40 has been removed List Y = new List { 1, 2, 3, 4};
或者
ListX = new List { 10, 20, 30 ,40 }; List Y = new List { 1, 2, 3}; // Element 4 has been removed
对于第一种情况,两个集合中,X 列表的项数最少为 3,而对于第二种情况,Y 列表的项数也相同。
方法将迭代 3 次,如结果所示
但其他方法将失败,并引发 ArgumentOutOfRangeException,而这需要特殊处理才能正常工作。
参考文献
结论
在本简短教程中,我们已经了解了框架 4.0 中引入的 Zip 扩展方法的一些便捷用法。
非常感谢您对该主题的评论,以便改进该主题。
感谢阅读本文。