代码之家  ›  专栏  ›  技术社区  ›  kofifus

LINQ产生所有元素

  •  -1
  • kofifus  · 技术社区  · 7 年前

    当我想得到一个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 回复  |  直到 7 年前
        1
  •  3
  •   John Wu    7 年前

    如果只是为了练习列表,而不想构造或分配任何类型的数组,那么可以使用 Last() ,它将在所有元素上迭代,直到到达最后一个元素(请参见 source

    如果你真的对结果感兴趣,在大多数情况下,你应该 use ToList() 不要想得太多。

    IEnumerable<T> 没有混凝土类型的容器;你必须选择一个,然后 ToList() 是最明显的选择,开销低。

    别忘了 ToListAsync() 如果你不想等它结束。

        2
  •  0
  •   Rand Random    7 年前

    您不必在一行程序中编写LINQ操作,您可以将其进一步扩展:

    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> .