当我想获得一个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
更好的所有元素?
答案 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>
继续您的工作。