如果Predicate返回true,则Lambda表达式返回什么

时间:2013-01-16 07:53:46

标签: c#

如果参数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}

因此,如果条件为真,似乎返回了输入。

如果我错了,请指导我

3 个答案:

答案 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背景,这是更好的方法:)