나는 Linq의 이상한 행동을 가로 질러 왔어 : 동일한 결과가 나는 것 같은 두 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가 출력됩니다. ..... –
나는 3 대의 컴퓨터에 그것을 시도했다 : 진실한, 틀린 (DOT.NET 4.0) 그리고 당신의 코멘트 후에 다시 시도하십시오. – Akli
L.B. 아마도 C# 5를 사용하고있을 것입니다. 그들은 클로저 처리 방법을 변경했습니다. http://blogs.msdn.com/b/ericlippert/archive/2009/11/12/closing-over-the-loop-variable-considered-harmful.aspx –