LINQ产生所有元素

时间:2019-01-02 08:01:13

标签: c# linq c#-7.0

当我想获得一个IEnumerable来迅速实现/获得其所有结果时,我通常会像这样使用ToList()

var myList= new List<int>();
IEnumerable<int> myXs = myList.Select(item => item.x).ToList();

我通常在锁定返回Linq查询结果的方法时这样做。

在这种情况下,我实际上对将收藏变成列表并不感兴趣,而且我通常不想知道它的类型。我只是使用ToList()来产生副作用-产生所有元素。

例如,如果我将类型从List更改为Array,我还必须记住将ToList()更改为ToArray()或遭受性能损失。

我可以做foreach( var e in myList ) { },但不确定是否会在某个时候对其进行优化?

我正在寻找类似myList.Select(item => item.x).yield()

的东西

最好的方法是什么?有没有一种方法可以简单地告诉Linq结果产生比ToList更好的所有元素?

2 个答案:

答案 0 :(得分:3)

如果仅是为了执行列表,而又不想构造或分配任何类型的数组,则可以使用Last(),它将简单地遍历所有元素,直到到达最后一个(请参见source)。

如果您实际上对结果感兴趣,那么在大多数情况下,您应该只use ToList(),而不要考虑太多。

如果要稍后检索结果,则无法避免分配某种存储。没有没有具体类型的魔术IEnumerable<T>容器;您必须选择一个,而ToList()是开销很低的最明显的选择。

如果您不想等待ToListAsync()完成,请不要忘记。

答案 1 :(得分:0)

仅供参考,因为也许是问题所在

您不必一口气编写LINQ Operations,您可以进一步扩展它:

例如:

var myList = new List<T>();
var result = myList.Select(x => x.Foo).Where(x => x.City == "Vienna").Where(x => x.Big == true).ToList();

可以重写为:

var myList = new List<T>();

//get an IEnumerable<Foo>
var foos = myList.Select(x => x.Foo);

//get an IEnumerable<Foo> which is filtered by the City Vienna
var foosByCity = foos.Where(x => x.City == "Vienna");

//get an IEnumerable<Foo> which is futher filtered by Big == true
var foosByCityByBig = foosByCity.Where(x => x.Big == true);

//now you could call to list on the last IEnumerable, but you dont have to
var result = foosByCityByBig.ToList();

所以无论您的目标是什么,也许您都可以更改路线

var myList= new List<int>();
IEnumerable<int> myXs = myList.Select(item => item.x).ToList();

对此:

var myList= new List<int>();
IEnumerable<int> myXs = myList.Select(item => item.x);

myXs作为IEnumerable<int>继续您的工作。