首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是ToList()还是非ToList()?

是ToList()还是非ToList()?
EN

Stack Overflow用户
提问于 2015-05-01 10:06:21
回答 4查看 4.9K关注 0票数 7

给定内存中的(而不是LINQ )类列表:

代码语言:javascript
复制
List<MyClass> myItems = /*lots and lots of items*/;

我使用GroupBy()语句对其进行分组:

代码语言:javascript
复制
myItems.GroupBy(g => g.Ref)

然后立即在foreach循环中使用,在“组”上调用.ToList()有什么区别,还是应该只使用IEnumerable

因此,完整的代码示例:

ToList()

代码语言:javascript
复制
List<List<MyClass>> groupedItemsA = new List<List<MyClass>>();
List<List<MyClass>> groupedItemsB = new List<List<MyClass>>();

List<MyClass> myItems = /*lots and lots of items*/;
List<IGrouping<string, MyClass>> groupedItems = myItems.GroupBy(g => g.Ref).ToList();
foreach(IGrouping<string, MyClass> item in groupedItems)
{
  if (/*check something*/)
  {
     groupedItemsA.Add(item.ToList());
  }
  else
  {
    groupedItemsB.Add(item.ToList());
  }
}

使用IEnumerable

代码语言:javascript
复制
List<List<MyClass>> groupedItemsA = new List<List<MyClass>>();
List<List<MyClass>> groupedItemsB = new List<List<MyClass>>();


List<MyClass> myItems = /*lots and lots of items*/;
IEnumerable<IGrouping<string, MyClass>> groupedItems = myItems.GroupBy(g => g.Ref);
foreach(IGrouping<string, MyClass> item in groupedItems)
{
  if (/*check something*/)
  {
     groupedItemsA.Add(item.ToList());
  }
  else
  {
    groupedItemsB.Add(item.ToList());
  }
}

这些“引擎盖下”的执行计划有什么不同吗?这两种方法中的哪一种会更有效率,还是根本不重要?

我是,而不是,在此之后使用groupedItems列表。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-05-01 10:15:05

是的,这是有区别的,这可能是很重要的。

ToList()将迭代每个迭代项并将其追加到一个新列表中。这样做的效果是创建一个临时列表来消耗内存。

有时,您可能想要承受内存损失,特别是如果您打算多次迭代列表,而原来的列表不在内存中。

在使用ToList()的特定示例中,实际上您最终会迭代两次--一次来构建列表,另一次在您的预测中进行迭代。取决于列表和应用程序的大小,这可能是一个问题,也可能不是一个问题。

票数 7
EN

Stack Overflow用户

发布于 2015-05-01 10:09:15

如果您确定只使用groupedItems一次,那么使用.ToList()有一个优点:如果有异常(例如,因为您的代码正在为计算.Ref做有趣的事情),那么异常将出现在.ToList()行中,而不是在foreach中.我不认为这是一个很大的优势(也许这是一个劣势)。

澄清:

代码语言:javascript
复制
public class MyClass
{
    public string Ref
    {
        get
        {
            // sometimes I like to throw an exception!
            if (DateTime.Now.Ticks % 10 == 0) throw new Exception();

            return "Foo";
        }
    }
}

请注意,您已经显式地将这个问题标记为IEnumerable,在您的示例中,myItems是一个List<>,所以当您通过实体框架/Linq从数据库读取数据到SQL时,我将不讨论执行ToList()的区别。

票数 2
EN

Stack Overflow用户

发布于 2015-05-01 10:08:35

有什么不同吗?

是的,.ToList()通过迭代分组集合创建了一个新列表:

method forces immediate query evaluation and returns a List that contains the query results

这是否值得注意,应该由你来衡量。

如果只迭代分组集合一次,则.ToList()步骤是不必要的,并且相对于直接枚举GroupBy()结果要慢一些。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29984957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档