2011-08-23 194 views
1

我從LINQ Where子句中得到一些行爲,但我不太滿意。LINQ Where子句誤解

例如,我正在嘗試使用AND語義搜索條件列表。

下面是一些代碼:

var items = new List<string>() 
{ 
    "beef", 
    "beef soup", 
    "beef ribs", 
    "chicken soup", 
    "soup", 
    "pork ribs", 
    "ribs" 
}; 

var term = "soup beef"; 
var terms = term.Split(' '); 
var result = items.AsQueryable(); 
foreach(var t in terms) 
{ 
    result = result.Where(i => i.Contains(t)); 
} 
result.ToList().Dump(); 

結果是:

  • 牛牛
  • 牛肋骨

不過,我一直在尋找它到AND結果,只返回:

  • 牛肉湯

現在,我可以通過簡單地添加

.ToList().AsQueryable()

WHERE子句的末尾得到的結果我想要的。

當然,如果後端是數據庫,這不是我想要做的。

什麼是真正奇怪的在這裏的是,當我在循環檢查「結果」,我得到如下:

  1. 第一where子句=>完整名單之前 - >有道理。
  2. 之後第一個地方('湯')=> ['牛肉湯','雞湯','湯'] - >仍然看起來不錯
  3. 第二次循環之前('牛肉')=> [牛肉','牛肉湯','牛肋骨'] - > WHOA!怎麼了這裏
  4. 後第二個循環=>保持不變

能向我解釋的人是怎麼回事(以及如何正確地解決這一問題)?

+0

你經常有人問,你已經發現這是由於關閉了循環變量。請參閱:http://blogs.msdn.com/b/ericlippert/archive/2009/11/12/closing-over-the-loop-variable-considered-harmful.aspx請注意,他們正在考慮[改變行爲C#5](http:// stackoverflow。COM /問題/ 7123898 /λ-捕獲問題與 - 迭代器/ 7124236#7124236)。 –

+0

確認。他們正在C#5中進行重大改變。這使得'foreach'循環與'for'循環有獨特的不同。 –

回答

0

CLOSURES !!! Arg .... 明白了。

var cTerm = t; 

    result = result.Where(i => i.Contains(cTerm)); 

很抱歉的隨機性...