林克效率中的Where子句



我的Linq查询的开头如下。

只注意where子句。Linq只执行ToLower()一次吗?还是对searchWords的每个元素都执行ToLower()?

var products = from d in xElem.Descendants(fileName)
                        where searchWords.All(t => d.Element(productName).Value.ToLower().Contains(t))

假设这是LINQ to Objects,它绝对会对searchWords的每个元素执行此操作(实际上是Element调用)。并没有什么地方可以真正存储状态来隐含地做其他事情。你可以自己轻松地优化它:

var products = from d in xElem.Descendants(fileName)
               let lowerD = d.Element(productName).Value.ToLower()
               where searchWords.All(t => lowerD.Contains(t))

或者在非查询表达式中,可以使用lambda:语句

var products = xElem.Descendants(fileName)
                    .Where(d => {
                        string lowerD = d.Element(productName).Value.ToLower();
                        return searchWords.All(t => lowerD.Contains(t));
                    })
                    ... // rest of query

请注意,还有其他更稳健的执行不区分大小写比较的方法。例如:

var products = from d in xElem.Descendants(fileName)
               let v = d.Element(productName).Value
               where searchWords.All(t => 
                  v.IndexOf(t, StringComparison.CurrentCultureIgnoreCase) != -1)

最新更新