C#列表parsing简介

我如何在C#中执行列表推导?

列表理解是程序员可以描述集合的成员必须符合的属性的集合符号的一种types。 它通常用于通过对现有集合应用某种types的组合,变换或缩减function来创build基于其他已经存在的集合或集合的集合。

考虑以下问题:您有一个从0到9的10个数字序列,您需要从该序列中提取所有偶数。 在C#1.1这样的语言中,你几乎只限于下面的代码来解决这个问题:

ArrayList evens = new ArrayList(); ArrayList numbers = Range(10); int size = numbers.Count; int i = 0; while (i < size) { if (i % 2 == 0) { evens.Add(i); } i++; } 

上面的代码没有显示Range函数的实现,可以在下面的完整代码中find它。 随着C#3.0和.NET Framework 3.5的出现,基于Linq的List Comprehension符号现在可供C#程序员使用。 上面的C#1.1代码可以像这样移植到C#3.0中:

 IEnumerable<int> numbers = Enumerable.Range(0, 10); var evens = from num in numbers where num % 2 == 0 select num; 

从技术上讲,上面的C#3.0代码可以写成一行,方法是将调用移到Enumarable.Range到Linqexpression式,以生成平均序列。 在C#List Comprehension中,我通过对该序列应用一个函数(模2)来减less设置的数字 。 这将以更简洁的方式产生均衡序列,并避免使用循环语法。 现在,你可能会问自己:这是纯语法糖吗? 我不知道,但我会定性调查,甚至可能在这里自问。 我怀疑这不仅仅是语法糖,而且还有一些真正的优化可以通过利用底层单元来完成。

完整的代码清单可以在这里find 。

当我正在查找如何做C#中的列表推导…

当有人说列表parsing我立即想到Python。 下面的代码生成一个如下所示的列表:

 [0,2,4,6,8,10,12,14,16,18] 

Python的方式是这样的:

 list = [2*number for number in range(0,10)] 

在C#中:

 var list2 = from number in Enumerable.Range(0, 10) select 2*number; 

两种方法都被懒惰地评估过。

@I P

  return (from user in users where user.Valid select user.Name).ToArray(); 

您可以使用LINQ来创build类似于列表parsing的expression式。 这里有一个网站解释一下:

在C#中用LINQ列表理解

使用LINQ在C#中理解理解 – 第2部分

虽然这不是一个教程,下面是一些说明这个概念的代码:

 public List<string> ValidUsers(List<User> users) { List<string> names = new List<string>(); foreach(User user in users) { if(user.Valid) { names.Add(user.Name); } } return names; }