2012-07-18 52 views
3

我今天正在通過一個MVC4教程,看到用戶以不同於以前的方式實現了一個選擇。他的代碼是:通過LINQ.ToList()使用List.AddRange是否有任何好處?

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更好嗎?

感謝您的閱讀!

+1

好吧,'AddRange'可以讓你添加項目到現有的列表。 'ToList'沒有。 – 2012-07-18 17:38:40

+0

@TimSchmelter AddRange足夠智能,可以查看範圍內正在添加的項目數量,並且足夠增加緩衝區的大小。你仍然會分配默認的大小爲10的緩衝區而不使用它,但是你不會重新分配大量的緩衝區。 – Servy 2012-07-18 17:50:17

+0

@Servy:對不起,剛刪除我的評論。如果查詢沒有執行,它就不能查看數字,只要它可以被轉換爲「ICollection ''。否則,它必須被執行和枚舉。在這種情況下,大小是未知的,並且列表可能是需要的兩倍。 – 2012-07-18 17:52:41

回答

11

e.ToList<T>()是引擎蓋下實現爲:

return new List<T>(e); 

而且List<T>(IEnumerable<T> e)構造實際上只是調用this.AddRange(e)內部。

換句話說,這兩個代碼將以完全相同的方式完成同樣的事情。

相關問題