Ich bin überrascht, dass es anscheinend keine Rolle spielt, ob ich LINQ-Erweiterungsmethoden vorangestellt oder angehängt habe.
Getestet mit Enumerable.FirstOrDefault
:
hugeList.Where(x => x.Text.Contains("10000")).FirstOrDefault();
-
hugeList.FirstOrDefault(x => x.Text.Contains("10000"));
var hugeList = Enumerable.Range(1, 50000000) .Select(i => new { ID = i, Text = "Item" + i }); var sw1 = new System.Diagnostics.Stopwatch(); var sw2 = new System.Diagnostics.Stopwatch(); sw1.Start(); for(int i=0;i<1000;i++) hugeList.Where(x => x.Text.Contains("10000")).FirstOrDefault(); sw1.Stop(); sw2.Start(); for(int i=0;i<1000;i++) hugeList.FirstOrDefault(x => x.Text.Contains("10000")); sw2.Stop(); var result1 = String.Format("FirstOrDefault after: {0} FirstOrDefault before: {1}", sw1.Elapsed, sw2.Elapsed); //result1: FirstOrDefault after: 00:00:03.3169683 FirstOrDefault before: 00:00:03.0463219 sw2.Restart(); for (int i = 0; i < 1000; i++) hugeList.FirstOrDefault(x => x.Text.Contains("10000")); sw2.Stop(); sw1.Restart(); for (int i = 0; i < 1000; i++) hugeList.Where(x => x.Text.Contains("10000")).FirstOrDefault(); sw1.Stop(); var result2 = String.Format("FirstOrDefault before: {0} FirstOrDefault after: {1}", sw2.Elapsed, sw1.Elapsed); //result2: FirstOrDefault before: 00:00:03.6833079 FirstOrDefault after: 00:00:03.1675611 //average after:3.2422647 before: 3.3648149 (all seconds)
Ich hätte vermutet, dass es langsamer wäre, die Where
da es alle übereinstimmenden Elemente finden muss und dann das erste und ein vorangehendes FirstOrDefault
könnte das erste gefundene Objekt ergeben.
Q: Kann mir jemand erklären, warum ich auf dem falschen Weg bin?