2014-09-05 79 views
2
public class Person { 
    public string First { get; set; } 
    public string Last { get; set; } 
} 

和呼叫:解釋這些LINQ的代碼

var persons = new List<Person>(); 
persons.Add(new Person {First = "First 04", Last = "Last 04"}); 
persons.Add(new Person {First = "First 03", Last = "Last 03"}); 
persons.Add(new Person {First = "First 02", Last = "Last 02"}); 
persons.Add(new Person {First = "First 01", Last = "Last 01"}); 

var claim1 = new List<Person>(from c in persons select c); 
var claim2 = new List<Person>(persons); 

有什麼區別,或者使用本聲明

var claim1 = new List<Person>(from c in persons select c); 

在這句話的優勢。

var claim2 = new List<Person>(persons); 
+0

是什麼讓你覺得這些不同?我的意思是,它們*只要前者有一個通過所有數據傳遞的額外層即可。但根據定義,結果是相同的。 – 2014-09-05 03:44:29

+4

實際上,沒有。構造函數列表(IEnumerable src)'每次調用。不同之處在於,在第一種情況下,您在「System.Linq.Enumerable + WhereSelectListIterator」中將您的列表(它已經是'IEnumerable ')包裝起來,它對每個項目進行單位變換(即沒有)。沒有linq聲明中的進一步條款,使用它是一種浪費。 – spender 2014-09-05 03:46:22

+2

@spender你的評論是你應該把它放在答案部分的最佳答案 – Moes 2014-09-05 03:59:41

回答

4

from c in persons select c返回IEnumerable<Person>,在第二個第一種情況:List<Person>()但在這兩種情況下public List(IEnumerable<T> collection)被調用,所以這兩個語句之間沒有真正的區別。

如果拆卸的構造:

public List(IEnumerable<T> collection) 
{ 
    if (collection == null) 
    { 
     ThrowHelper.ThrowArgumentNullException(ExceptionArgument.collection); 
    } 
    ICollection<T> collection2 = collection as ICollection<T>; 
    if (collection2 == null) 
    { 
     this._size = 0; 
     this._items = List<T>._emptyArray; 
     using (IEnumerator<T> enumerator = collection.GetEnumerator()) 
     { 
      while (enumerator.MoveNext()) 
      { 
       this.Add(enumerator.Current); 
      } 
     } 
     return; 
    } 
    int count = collection2.Count; 
    if (count == 0) 
    { 
     this._items = List<T>._emptyArray; 
     return; 
    } 
    this._items = new T[count]; 
    collection2.CopyTo(this._items, 0); 
    this._size = count; 
} 

我們可以看到,如果collectionICollection<T>ICollection<T>.CopyTo被稱爲比複製一個接一個更加高效。

4

兩個代碼都創建一個新列表。在第一種方法中,您從您從該linq表達式獲得的IEnumerable集合中創建它,而在第二種方法中,您直接使用List。我不認爲這有什麼區別,但我認爲第一個是不好的做法,因爲它使代碼更難理解,難以閱讀和難以維護。