【发布时间】:2012-10-31 18:22:59
【问题描述】:
我遇到了 Linq 的一个奇怪行为:两个可能看起来相同的 linq 表达式我有不同的结果!如果我循环一次得到相同的结果,但在上面什么都找不到。
代码如下:
Dictionary<String, String> mainDico = new Dictionary<String, String>();
mainDico.Add("key1", "value1");
mainDico.Add("key2", "value2");
List<Dictionary<String, String>> ls = new List<Dictionary<String, String>>();
Dictionary<String, String> fistDico = new Dictionary<String, String>();
fistDico.Add("key1", "value1");
fistDico.Add("key2", "value2");
Dictionary<String, String> secondDico = new Dictionary<String, String>();
secondDico.Add("key1", "other");
secondDico.Add("key2", "other");
ls.Add(fistDico);
ls.Add(secondDico);
IEnumerable<Dictionary<String, String>> failQuery = from p in ls
select p;
IEnumerable<Dictionary<String, String>> successfulQuery = from p in ls
select p;
String[] items = new String[] { "key1","key2" }; // with one element it works
foreach (var item in items)
{
String temp = mainDico[item];
failQuery = failQuery.Where(p => p[item] == temp);
successfulQuery = successfulQuery.Where(p => p[item] == mainDico[item]);
}
Console.WriteLine(successfulQuery.SingleOrDefault() != null);//True
Console.WriteLine(failQuery.SingleOrDefault() != null);//False
【问题讨论】:
-
只需复制/粘贴您的代码,它就会输出 true,true......
-
我在三台电脑上试了试:True, False (DOT.NET 4.0) 并在您发表评论后再次尝试。
-
L.B.可能正在使用 c# 5。他们改变了处理闭包的方式:blogs.msdn.com/b/ericlippert/archive/2009/11/12/…
标签: c# linq dictionary