如何在C#中执行列表推导?
List Comprehension是一种集合表示法,程序员可以在其中描述集合成员必须满足的属性.它通常用于通过将某种类型的组合,转换或缩减功能应用于现有集合来基于其他已存在的集合或集合来创建集合.
请考虑以下问题:您有一个从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函数的实现,该函数在下面的完整代码清单中提供.随着C#3.0和.NET Framework 3.5的出现,基于Linq的List Comprehension符号现在可供C#程序员使用.上面的C#1.1代码可以像这样移植到C#3.0:
IEnumerablenumbers = Enumerable.Range(0, 10); var evens = from num in numbers where num % 2 == 0 select num;
和技术上来说,在C#3.0以上代码可以通过移动呼叫要被写入作为一衬垫Enumarable.Range到生成的LINQ表达式唇上序列.在C#List Comprehension中,我通过将一个函数(模2)应用于该序列来减少集合数.这以更简洁的方式产生均衡序列并避免使用循环语法.现在,您可能会问自己:这纯粹是语法糖吗?我不知道,但我会明确地调查,甚至可能在这里问自己的问题.我怀疑这不只是语法糖,并且可以通过利用底层monad进行一些真正的优化.
完整的代码清单可在此处获得.
当我在C#中查找如何进行列表推导时找到了这个...
当有人说列表理解时,我会立即想到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;
两种方法都被懒惰地评估.
@Ian P.
return (from user in users where user.Valid select user.Name).ToArray();