LINQ 拡張メソッドを先頭に追加するか追加するかは明らかに問題ではないことに驚いています。
テスト済み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)
Where
一致するすべてのアイテムを見つけてから最初のものを取得する必要があり、先行するとFirstOrDefault
最初に見つかったアイテムが生成される可能性があるため、先頭に追加するのは遅くなると思いました。
Q:なぜ私が間違った道を歩んでいるのか誰か説明してもらえますか?