2014-01-07 84 views
1

我是C#和.NET世界的新手。我想了解以下聲明。與C#中的Enumerable.Select混淆#

var xyz = Enumerable.Repeat(obj, 1).ToList(); 
var abc = 
    xyz.Select(xyzobj => new res { 
     foo = bar, 
     xyzs = new [] {xyzobj}, 
    }).ToList(); 

據我所知,在選擇對象和變壓器的功能需要和返回對象的一種新形式。但在這裏,它需要一個帶有枚舉值和另一個對象的lambda表達式。

我有點困惑。以上是類似於

var abc = xyz.Select(xyzobj => { 
    //some work with xyzobj 
    //and return object. 
    }).ToList(); 

聲明有人可以解釋上述說法實際上做了,我的頭剛好與這些陳述打轉各地在我的新工作地點。

有人可以指導我找到很好的資源來理解lambda表達式和枚舉。

+5

首先,從* valid *代碼開始。 '1 => ..'是無稽之談,會導致編譯器錯誤。 – user2864740

+3

MSDN是你最好的選擇:http://msdn.microsoft.com/en-us/library/bb397687.aspx。選擇只是一個投影工作。 –

+0

你可能也想看看這個: - http://blogs.msdn.com/b/matt/archive/2008/03/01/understanding-variable-capturing-in-c.aspx – sh1rts

回答

4

在C#中有兩種主要的lambda表達式類型。

表達lambda表達式是這樣的:

x => foo(x); 

這需要一個參數x,並對其進行了一些改造,foo,返回foo(x)結果(雖然在技術上它可能不會返回結果類型的值foo(x)void)。

聲明lambda表達式看起來像這樣:

x => { 
    // code block 
} 

這需要一個參數,x並在其上執行一些動作,(任選地返回一個值,如果提供了顯式return)。代碼塊可能由多個語句組成,這意味着您可以聲明變量,執行循環等。這在簡單表達式lambda語法中不受支持。但它只是另一種類型的lambda。

如果有幫助,你能想到的等價(儘管它們並不是完全等價的,如果你試圖解析以此爲Expression)如下:

x => foo(x); 

x => { return foo(x); } 

進一步閱讀

0
// Creates a IEnumerable<T> of the type of obj with 1 element and converts it to a List 
var xyz = Enumerable.Repeat(obj, 1).ToList(); 


// Select takes each element in the List xyz 
// and passes it to the lambda as the parameter xyzobj. 
// Each element is used to create a new res object with object initialization. 
// The res object has two properties, foo and xyzs. foo is given the value bar 
// (which was defined elsewhere). 
// The xyzs property is created using the element from xyz passed into the lambda 
var abc = xyz.Select(
    xyzobj => new res { 
     foo = bar, 
     xyzs = new [] {xyzobj}, 
    }).ToList();