C#在哪里,并选择

问题描述:

有人可以请帮忙解释下面的代码中发生了什么?非常感谢!结果是meo,但我不明白这两个'在哪里'在这种情况下工作。C#在哪里,并选择

public class Cat { 
    public string Text { get; set; } 
    public Cat Where(Func<Cat,bool> cond) { 
    return new Cat { 
     Text = cond(this)? this.Text.ToUpper(): this.Text.ToLower() 
    }; } 
    } 
public static class CatExtensions { 
    public static T Select<T>(this Cat cat, Func<Cat,T> proj) 
     { 
     return proj(cat); 
     } 
} 


var moggy = new Cat { Text = "Meo" }; 
var result = from m in moggy 
    where true 
    where false 
    select m.Text; 

它很容易,如果你看那个表达的方法链式语法版本明白:

moggy 
    .Where(m => true)  // returns new Cat { Text = "MEO" } 
    .Where(m => false) // returns new Cat { Text = "meo" } 
    .Select(m => m.Text); // returns "meo" 
+0

第二个where子句不会让当前的'Cat'通过,是吗? – displayName

+0

谢谢!我有点困惑。是哪里的扩展方法在哪里?为什么在使用(小写字母)的表达式中,在何处查看表达式? – user3735871

+0

'Where'是类Cat中定义的自定义方法。它不是.NET框架中的Where方法。 –

这些是多重LINQ中的Where子句。

通常这是一个简单而conditon

例如说我们有一个客户实体,我们有存储在一个不同的结果所有的客户,我们希望得到它的名字是约翰和姓氏是客户母鹿,那么我们会做

results.Where(x => (x.FirstName == "John") && (x.LasttName == "Doe")); 

现在这一段代码可以被写入2 Where子句像

results.Where(x => (x.FirstName == "John")) 
     .Where(x => (x.LasttName == "Doe")); 
+0

这不相关或适用于此。 –

from a in B where E被认为是一样的B.Where(a => E)

由于类定义了自己的Where方法,因此使用这些方法而不是由Linq定义的方法,因为实例方法总是选择扩展方法(如果可用)。无论如何,这些方法也不适用。

第一个返回一个全部大写的MEO猫,然后第二个作用于那个并返回一个全部降低的情况meo猫。

select是一个扩展方法,并将委托应用于最后一个对象。