如何在C#中像Python一样通过表达式简洁初始化列表?
问题
我有一个返回对象的函数,C#版本如下:
public object toto() {}
Python版本如下:
def toto(): return "something"
我想以非常简洁的方式初始化一个包含n个元素的列表,在Python中可通过列表推导式实现:
l = [toto() for i in range(1, n+1)]
请问在C#中有没有类似的简洁方式,无需使用循环?
回答
C#里可以借助LINQ实现和Python列表推导式类似的简洁写法,无需手动编写循环:
方法一:结合Enumerable.Range和Select
先确保代码文件顶部引入LINQ的命名空间:
using System.Linq;
然后用一行代码生成目标列表:
var list = Enumerable.Range(1, n).Select(_ => toto()).ToList();
Enumerable.Range(1, n)生成从1到n的整数序列,和Python的range(1, n+1)效果一致;Select(_ => toto())对序列中的每个元素调用toto()(下划线_表示不需要使用循环变量);ToList()将最终的序列转换为List<object>类型。
方法二:结合Enumerable.Repeat和Select
如果不需要生成特定范围的整数序列,只是需要生成n个元素,也可以用这种写法:
var list = Enumerable.Repeat(0, n).Select(_ => toto()).ToList();
注意:不能直接用Enumerable.Repeat(toto(), n),因为这只会调用一次toto(),然后重复返回同一个对象的引用,而我们需要的是每次调用toto()生成新对象,所以必须搭配Select来实现。
内容的提问来源于stack exchange,提问作者Milan
相关产品推荐
相关产品推荐

