65.9K
CodeProject 正在变化。 阅读更多。
Home

Zip 扩展方法 - Dotnet 4.0

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.63/5 (16投票s)

2010年10月25日

CPOL

2分钟阅读

viewsIcon

24867

downloadIcon

126

本文将介绍 ZIP 扩展方法的一些功能。

引言

C#4.0 引入了新的 Zip 扩展方法。

目的

使用指定的谓词函数合并两个序列。

签名

public static IEnumerable Zip
(
	this IEnumerable first
	, IEnumerable second
	, Func resultSelector
);

关于参数说明

first: 要合并的第一个序列。

second: 要合并的第二个序列。

resultSelector: 一个函数,用于指定如何合并两个序列的元素。

返回值: 一个 System.Collections.Generic.IEnumerable包含两个输入序列合并后的元素。

使用代码

让我们看一些例子

示例输入

List x = new List { 10, 20, 30, 40 };
List y = new List { 1, 2, 3, 4 };

目标

执行 x[i] * y[i]

期望输出

1.jpg

方法 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 扩展方法对每个元素执行显示操作。

扩展方法的另一个特点是,它会考虑最短的源进行迭代。

例如:

让我们以以下来源为例

List X = new List { 10, 20, 30 }; //Element 40 has been removed
List Y = new List { 1, 2, 3, 4};

或者

List X = new List { 10, 20, 30 ,40 };
List Y = new List { 1, 2, 3}; // Element 4 has been removed

对于第一种情况,两个集合中,X 列表的项数最少为 3,而对于第二种情况,Y 列表的项数也相同。

方法将迭代 3 次,如结果所示

2.jpg

但其他方法将失败,并引发 ArgumentOutOfRangeException,而这需要特殊处理才能正常工作。

参考文献

Enumerable.Zip

结论

在本简短教程中,我们已经了解了框架 4.0 中引入的 Zip 扩展方法的一些便捷用法。

非常感谢您对该主题的评论,以便改进该主题。

感谢阅读本文。

© . All rights reserved.