2015-11-06 84 views
3

有人可以請幫忙解釋下面的代碼中發生了什麼?非常感謝!結果是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; 

回答

4

它很容易,如果你看那個表達的方法鏈式語法版本明白:

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方法。 –

0

這些是多重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

這不相關或適用於此。 –

3

from a in B where E被認爲是一樣的B.Where(a => E)

由於類定義了自己的Where方法,因此使用這些方法而不是由Linq定義的方法,因爲實例方法總是選擇擴展方法(如果可用)。無論如何,這些方法也不適用。

第一個返回一個全部大寫的MEO貓,然後第二個作用於那個並返回一個全部降低的情況meo貓。

select是一個擴展方法,並將委託應用於最後一個對象。