LINQ Where子句误解

时间:2011-08-23 15:26:56

标签: linq

我从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. 在first where clause =&gt;之前完整列表 - &gt;有道理。
  2. 首先在哪里('汤')=&gt; ['牛肉汤','鸡汤','汤'] - &gt;看起来还不错
  3. 在第二次循环之前(对于'牛肉')=&gt; ['牛肉','牛肉汤','牛肋骨'] - &gt;哇!什么东西在这里
  4. 第二次循环=&gt;保持不变
  5. 有人可以向我解释发生了什么(以及如何正确解决这个问题)?

2 个答案:

答案 0 :(得分:3)

查看对已修改关闭的访问

http://weblogs.asp.net/fbouma/archive/2009/06/25/linq-beware-of-the-access-to-modified-closure-demon.aspx

基本上问题是你的t循环中正在修改foreach,但是你在闭包中使用它(Where lambda方法),它通过引用访问t

答案 1 :(得分:0)

封闭件!!!精氨酸.... 明白了。

    var cTerm = t;

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

抱歉随机...