人们在第一次使用LINQ时遇到的根本误解是什么?
例如,他们认为当它真的是别的时候它是一回事吗?
并且,是否有一些最佳实践来避免这些错误?
我很惊讶,无论我是在前置还是附加LINQ扩展方法都没关系.
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++) …Run Code Online (Sandbox Code Playgroud)采取下面的代码,改编自这个问题:
//Borrowed from another question because its a simpler example of what happened to me.
IEnumerable<char> query = "Not what you might expect";
foreach(char vowel in "aeiou")
{
query = query.Where(c => c != vowel);
}
foreach (char Output in query)
{
System.Out.WriteLine(Output);
}
Run Code Online (Sandbox Code Playgroud)
这只会从查询字符集中删除"u".核心问题与第二个foreach c中的Where子句中的变量未被评估的事实有关.我的问题是:
1)为什么第一个foreach生成的委托不会捕获c构建的每个值?是否有一些情况我不知道哪里不是理想的行为?
2)如果它没有捕获值c,那么当查询实际运行时,该值是否仍然在第二个foreach的范围内?在我看来,如果它没有存储传入的变量的值,那么尝试解析第二个foreach的语句将失败,因为该变量c显然超出了范围.
我不明白为什么'在范围内使用我们在这个变量上看到的最后一个值'对于这种情况是一个很好的设计决策,并且希望有人可以对这个问题有所了解.