【问题标题】:Is there any benefits to using List.AddRange over a LINQ.ToList()?在 LINQ.ToList() 上使用 List.AddRange 有什么好处吗?
【发布时间】:2012-07-17 19:53:57
【问题描述】:

我今天正在学习 MVC4 教程,并看到用户以与我习惯不同的方式实现选择。他的代码是:

var GenreLst = new List<string>(); 

var GenreQry = from d in db.Movies 
               orderby d.Genre 
               select d.Genre; 
GenreLst.AddRange(GenreQry.Distinct()); 
ViewBag.movieGenre = new SelectList(GenreLst); 

我看了看,用我自己的方式改写成:

var genres = db.Movies
            .OrderBy(m => m.Genre)
            .Select(m => m.Genre)
            .Distinct()
            .ToList();

ViewBag.MovieGenre = new SelectList(genres);

他的 GenreList 变量没有在其他地方使用,所以我把它去掉了。我的主要问题是他如何使用 AddRange。 AddRange 比 ToList 更好吗?

感谢阅读!

【问题讨论】:

  • 好吧,AddRange 允许您将项目添加到现有列表中。 ToList 没有。
  • @TimSchmelter AddRange 足够聪明,可以查看范围内添加的项目数,并将缓冲区的大小增加一次,足够了。您仍将分配默认大小为 10 的缓冲区而不使用它,但不会重新分配大量缓冲区。
  • @Servy:抱歉,刚刚删除了我的评论。如果不执行查询,它就无法查看数字,只要它可以转换为ICollection&lt;T&gt;。否则它必须被执行和枚举。在这种情况下,直到结束之前大小都是未知的,并且列表可能是需要的两倍大..
  • @TimSchmelter 如果它实际上不是IList,那么构造函数也不会知道大小,所以它会以同样的方式工作。显然,程序员没有手动输入大小,所以他在编译时不知道 [近似] 大小是多少。
  • @Sery:是的,这不常见,但我想说的是,可能存在差异。 var range=Enumerable.Range(1, 10000000);List&lt;int&gt; list=range.ToList() 实际上比 list=new List&lt;int&gt;(10000000);list.AddRange(range) 效率低得多,甚至比 list=new List&lt;int&gt;(range.Count());list.AddRange(range) 效率低(因为后者将确保列表不会超出必要的范围)。

标签: c#


【解决方案1】:

e.ToList&lt;T&gt;() 在底层实现为:

return new List<T>(e);

List&lt;T&gt;(IEnumerable&lt;T&gt; e) 构造函数实际上只是在内部调用this.AddRange(e)

换句话说,这两段代码将以完全相同的方式做同样的事情。

【讨论】:

    猜你喜欢
    • 2011-04-24
    • 2018-01-29
    • 1970-01-01
    • 2014-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-02
    • 1970-01-01
    相关资源
    最近更新 更多