按照標題... list.First(),list.ElementAt(0)和list [0]之間是否有任何真正的區別?list.First(),list.ElementAt(0)和list [0]之間的區別?
回答
.First()
如果源列表中不包含任何元素,則會引發異常。 See the Remarks section。爲避免這種情況,請使用FirstOrDefault()
。.ElementAt(0)
如果索引大於或等於列表中元素的數量,將會拋出異常。爲避免這種情況,請使用ElementAtOrDefault(0)
。如果您使用LINQ To SQL,則不能將其轉換爲sql,而.First()
可以轉換爲TOP 1
。如果索引大於或等於列表中元素的數量,則索引器也會拋出異常。它不提供
OrDefault
選項以避免此問題,並且無法將其轉換爲LINQ To SQL的sql。編輯:我忘了提及簡單的明顯,如果你的對象是一個IEnumerable,你不能使用這樣的索引器。如果你的對象是一個真正的列表,那麼你很好。
沒有,沒有任何區別。他們都做同樣的事情,返回列表中的第一項。
編輯:我想我不應該說沒有區別。 ElementAt()和First()都有一些錯誤處理,它們檢查空值和超範圍索引,但它不應該引人注目。
在「有效」情況下(即列表中至少有一個元素時),它們與APShredder指出的相同。如果沒有元素,則list[0]
和list.ElementAt(0
將拋出ArgumentIndexOutOfRangeException
,而list.First()
將拋出InvalidOperationException
。
這些選項之間進行選擇的另一個考慮是,First()
和ElementAt(0)
都兼容任何序列 - 的IEnumerable
任何實現。 (這可能很有用,因爲這意味着您可以用不同的IEnumerable
實現替換變量,而無需更改任何代碼。)相比之下,索引器僅適用於直接實現該功能的列表和其他結構。相反,使用索引器可以是確保(在編譯時)獲得優化性能的好方法,因爲ElementAt
有合理的機會成爲O(n)而不是O(1),而索引器通常推測是快速的。
也許是一個老問題,但有一個性能差異。
下面的代碼:
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
這應該是upvoted更多,我認爲 – 2015-11-19 11:33:25
- 1. str [0]和str.charAt(0)之間的區別
- 2. 「return 0」和「exit(0)」之間的區別
- 3. 基數「*」和「0 .. *」之間的區別 - UML
- 4. srand(1)和srand(0)之間的區別
- 5. Array.length = 0和Array = []之間的區別?
- 6. next()和next().CharAt(0)之間的區別;
- 7. LinearRegression()和Ridge(alpha = 0)之間的區別
- 8. $ 0和$ SHELL之間的區別
- 9. {0}和「」之間有什麼區別?
- 10. BigDecimal(「0」)和BigDecimal.ZERO之間有區別嗎?
- 11. {0}和+之間有什麼區別?
- 12. firstChild和[0]之間有什麼區別?
- 13. strlen()== 0和empty()之間有區別嗎?
- 14. 字符串中的[0]和&a [0]之間的區別
- 15. PHP中的$ a = 0和$ a ='0'之間的區別
- 16. virtual void funcFoo()const = 0和virtual void funcFoo()= 0之間的區別;
- 17. [0-9] +和[0-9] ++之間的區別是什麼?
- 18. OWL-LIST和RDF-LIST之間的區別
- 19. `[blah addObject:@「1」];``和`[blah insertObject:@「0」atIndex:0]之間有什麼區別;`?
- 20. 之間有什麼區別{0}和{0,數字,整數}
- 21. (char)0和'\ 0'之間有什麼區別? in C
- 22. 「#if Foo - 0 == 0」和「#if defined(Foo)&& Foo == 0」之間的區別是什麼?
- 23. list(numpy_array)和numpy_array.tolist()之間的區別
- 24. List和IEnumerable之間的實際區別
- 25. ListResultDto和List之間的區別
- 26. Query .list和.getResultList之間的區別
- 27. Emacs中sexp和list之間的區別?
- 28. 什麼是char *海峽之間的區別是零和STR [0] ==「\ 0」
- 29. 劍道數據源模型 - _data之間的區別[0]和get(0)
- 30. i == 0和0 == i有區別嗎?
重:點2 - 個人而言,我寧願有一個索引超出範圍的例外比空引用的 - 那些xOrDefault()方法是邪惡的! – MattDavey 2011-09-09 08:42:04
@MattDavey對我來說,OrDefault方法需要一個空檢查是自我解釋。它們不會導致空引用異常,不好的編碼。 – ProfK 2012-10-11 08:57:53
@ProfK我沒有說他們引起空引用異常。我說我寧願有一個IndexOutOfRangeException比null引用。這當然是個人偏好,但是我沒有發現任何有用的空引用。 – MattDavey 2012-10-12 12:11:44