2013-01-16 57 views
3

如果参数fruit(我知道它是一个输入参数),如果条件对于谓词为真,则我很困惑。如下面的代码表示:如果Predicate返回true,则返回Lambda表达式

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

是,如果谓词对元素返回true,则该元素将位于由where返回的元素的子集中。它将返回长度小于8的数组中的任何字符串。 –

+0

你期望在第二个查询中只看到苹果吗? – ryadavilli

+0

这只是一个错字...它应该是IEnumerable query2 = query.Where(fruit => fruit.Contains(“apple”));'我猜 – horgh

回答

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")); 
+0

所以这就是它为什么返回水果(输入参数),因为条件为真。现在我们看下面的代码: – Sadiq

+0

@Sadiq它在每个项目的基础上应用谓词;它将从谓词为真的输入序列中产生所有事物的序列。这就是为什么第一次测试返回一个序列,产生短名称的成果。对于所有项目,第二个测试是正确的,因为谓词本身甚至不会查看它是哪个项目:它总是全是真或全是假。 –

+0

委托int anonymousDel(int i); anonymousDel myDelegate = new anonymousDel( delegate(int x) { return x * 2; }); 控制台。WriteLine(“{0}”,myDelegate(5)); anonymousDel myDelegate = x => x * 2;在这种情况下,IT不会返回输入参数 – Sadiq

1

LINQ当返回IEnumerably设定了谓词返回true的所有项目。

在你的第二个查询中,你正在做fruits.Contains("apple"),这基本上总是正确的,或者总是为false。也许你的意思做以下几点:

IEnumerable<string> query2 = query.Where(fruit => fruit == "apple"); 
//returns: {apple} 
1

你能想到的。凡拉姆达为SQL查询:

SELECT * FROM IEnumerable WHERE Predicate = TRUE; 

对我来说这是最好的方式,由于SQL背景:)