如果参数fruit
(我知道是输入参数)返回,如果谓词的条件为真,我会感到困惑。如下面的代码表示:
List<string> fruits = new List<string> {
"apple",
"passionfruit",
"banana",
"mango",
"orange",
"blueberry",
"grape",
"strawberry"
};
IEnumerable<string> query = fruits.Where(fruit => fruit.Length < 8);
// query contains: {apple,banana,mango,orange,grape}
IEnumerable<string> query2 = query.Where(fruit => fruits.Contains("apple"));
foreach (string fruity in query2)
{
Console.WriteLine(fruity);
}
// finally returns: {apple,banana,mango,orange,grape}
因此,如果条件为真,似乎返回了输入。
如果我错了,请指导我
答案 0 :(得分:4)
Where
返回谓词返回的输入的过滤序列true
。它依次应用于每个元素,并且该项目被生成或丢弃。基本上是:
public static IEnumerable<T>(this IEnumerable<T> source, Func<T,bool> predicate)
{
foreach(var el in source) {
if(predicate(el) {
yield return el;
}
}
}
看看名字:
IEnumerable<string> query2 = query.Where(fruit => fruits.Contains("apple"));
也就是说,对于每个fruit
,查看整套(fruits
,注意最后的s
)是否会返回一个苹果。列表fruits
包含apple
,因此每个水果都是如此。
你可能意味着:
IEnumerable<string> query2 = query.Where(fruit => fruit.Contains("apple"));
答案 1 :(得分:1)
LINQ Where返回一个IEnumerably设置,其中谓词返回的所有项为。
在你的第二个查询中,你正在做fruits.Contains("apple")
,这基本上总是正确的,或者总是假的。也许你打算做以下事情:
IEnumerable<string> query2 = query.Where(fruit => fruit == "apple");
//returns: {apple}
答案 2 :(得分:1)
您可以想到。将lambda作为SQL查询:
SELECT * FROM IEnumerable WHERE Predicate = TRUE;
对我来说,由于SQL背景,这是更好的方法:)