2011-08-23 61 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)); 

很抱歉的随机性...