与Enumerable混淆。在C#中选择

时间:2014-01-07 03:27:56

标签: c# lambda

我是C#和.NET世界的新手。我想了解以下声明。

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

我理解Select接受一个对象和一个变换器函数并返回一个新形式的对象。但是在这里,它接受带有枚举值的lambda表达式和另一个对象。

我很困惑。以上陈述是否类似于

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

有人可以解释上面的陈述实际上是这样做的,我的脑袋只是在我的新工作地点四处旋转这些陈述。

有人可以指导我使用良好的资源来理解lambda表达式和Enumeration。

2 个答案:

答案 0 :(得分:4)

C#中有两种主要的lambda表达式。

表达式lambdas是这样的:

x => foo(x);

这需要一个参数x,并对其执行一些转换foo,返回foo(x)的结果(虽然从技术上讲它可能不会返回结果类型{的值{1}}是foo(x))。

声明lambdas看起来像这样:

void

这需要一个参数x => { // code block } 并对其执行一些操作(如果提供了显式的x,则可选择返回一个值)。代码块可以由多个语句组成,这意味着您可以声明变量,执行循环等。更简单的表达式lambda语法不支持这种情况。但它只是另一种类型的lambda。

如果有帮助你可以认为以下内容是等效的(尽管如果你试图将其解析为Expression,它们并不完全等效):

return

进一步阅读

答案 1 :(得分: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();