2011-05-29 55 views

回答

24
  1. .First()如果源列表中不包含任何元素,則會引發異常。 See the Remarks section。爲避免這種情況,請使用FirstOrDefault()

  2. .ElementAt(0)如果索引大於或等於列表中元素的數量,將會拋出異常。爲避免這種情況,請使用ElementAtOrDefault(0)。如果您使用LINQ To SQL,則不能將其轉換爲sql,而.First()可以轉換爲TOP 1

  3. 如果索引大於或等於列表中元素的數量,則索引器也會拋出異常。它不提供OrDefault選項以避免此問題,並且無法將其轉換爲LINQ To SQL的sql。編輯:我忘了提及簡單的明顯,如果你的對象是一個IEnumerable,你不能使用這樣的索引器。如果你的對象是一個真正的列表,那麼你很好。

+1

重:點2 - 個人而言,我寧願有一個索引超出範圍的例外比空引用的 - 那些xOrDefault()方法是邪惡的! – MattDavey 2011-09-09 08:42:04

+2

@MattDavey對我來說,OrDefault方法需要一個空檢查是自我解釋。它們不會導致空引用異常,不好的編碼。 – ProfK 2012-10-11 08:57:53

+1

@ProfK我沒有說他們引起空引用異常。我說我寧願有一個IndexOutOfRangeException比null引用。這當然是個人偏好,但是我沒有發現任何有用的空引用。 – MattDavey 2012-10-12 12:11:44

1

沒有,沒有任何區別。他們都做同樣的事情,返回列表中的第一項。

編輯:我想我不應該說沒有區別。 ElementAt()和First()都有一些錯誤處理,它們檢查空值和超範圍索引,但它不應該引人注目。

6

在「有效」情況下(即列表中至少有一個元素時),它們與APShredder指出的相同。如果沒有元素,則list[0]list.ElementAt(0將拋出ArgumentIndexOutOfRangeException,而list.First()將拋出InvalidOperationException

6

這些選項之間進行選擇的另一個考慮是,First()ElementAt(0)都兼容任何序列 - 的IEnumerable任何實現。 (這可能很有用,因爲這意味着您可以用不同的IEnumerable實現替換變量,而無需更改任何代碼。)相比之下,索引器僅適用於直接實現該功能的列表和其他結構。相反,使用索引器可以是確保(在編譯時)獲得優化性能的好方法,因爲ElementAt有合理的機會成爲O(n)而不是O(1),而索引器通常推測是快速的。

11

也許是一個老問題,但有一個性能差異。

下面的代碼:

var lst = new List<int>(); 

      for (int i = 0; i < 1500; i++) 
      { 
       lst.Add(i); 
      } 
      int temp; 


      Stopwatch sw1 = new Stopwatch(); 

      sw1.Start(); 

      for (int i = 0; i < 100; i++) 
      { 
       temp = lst[0];  
      } 


      sw1.Stop(); 




      Stopwatch sw2 = new Stopwatch(); 
      sw2.Start(); 
      for (int i = 0; i < 100; i++) 
      { 
       temp = lst.First(); 
      } 

      sw2.Stop(); 

      Stopwatch sw3 = new Stopwatch(); 
      sw3.Start(); 
      for (int i = 0; i < 100; i++) 
      { 
       temp = lst.ElementAt(0); 
      } 

      sw3.Stop(); 

你會得到如下次(蜱):

sw1.ElapsedTicks

sw2.ElapsedTicks

sw3。ElapsedTicks

+1

這應該是upvoted更多,我認爲 – 2015-11-19 11:33:25

相關問題