2015-06-10 21 views
1

我一直在寻找一个解决方案,每个对象的属性转换上的列表一些阵列时终于让我找到this将对象列表转换为c#中的数组 - “x => x.Name”语法的含义是什么?

然后我发现这个代码

MyList.Select(x=>x.Name).ToArray(); 

这是解决我的问题。但我仍然不明白变量'x'的含义。任何人都可以简单地向我解释这个语法是如何工作的?

+0

x表示在MYLIST元件... –

+0

在运算符左侧的x是对应于输入变量x在查询表达式中。 – CodingDefined

+1

这是一个lambda表达式。请参阅https://msdn.microsoft.com/en-us/library/bb397687.aspx –

回答

4

LINQ .Select<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector)扩展方法需要一个Func,它接受一个参数并返回另一个(甚至相同)类型的对象/值。

您有几种方式来指定哪些函数来执行对您的枚举每个项目:

  • Lambda表达式:你在你的问题发布什么。 x => x.Namex是输入参数,x.Name是结果。也可以写成lambda语句:x => { return x.Name; }。 Lambda表达式是编写只能使用一次的简短方法的一种非常简洁的方式。 (另外,他们收集他们的周围范围在关闭 - 但这是不相关的在您的问题的上下文中)
  • 匿名委托:大体上与上述相同。将写为delegate(YourType x) { return x.Name; }
  • 方法组:在其他位置定义一个命名方法,并指定其名称:.Select(this.SelectName)SelectName将被写为:

    private string SelectName(YourType x) { 
        return x.Name; 
    } 
    

LINQ扩展方法一般工作于的IEnumerable<T>实例,所以任何类型的(主要是集合),它可以重复/枚举。 .Select()用于IEnumerable<TSource>类型的一个可枚举变换IEnumerable<TResult>类型的另一枚举。请注意,一旦可枚举被枚举(通过foreach.ToList(),.ToArray()或其他),将仅执行selector函数作为参数传递给.Select()

使用LINQ,您更专注于以数据为中心的视图类型。您不在乎.Select()内部是否使用foreach,for或任何其他方式访问您收藏的项目。它甚至可能并行操作(.AsParallel)。

当然,最LINQ调用可以用简单的码被改写,例如:

var nameList = List<String>(MyList.Count); 
foreach(var item in MyList) { 
    nameList.Add(item.Name); 
} 

var array = nameList.ToArray(); // this is still LINQ, 
           // but I didn't want to bother 
           // with re-allocating the array 
           // or with using indexing 
+0

在最后一段代码中输入错字。在函数体中,你的意思是说x.Name。我投票了,因为你给所有可能的方式来传递参数来选择。 –

+0

@ Khnle-Kevin:谢谢,我已经更新了我的问题。希望所有参数具有相同的名称并错过更新方法主体。 – knittl

0

这是一个lambda expression in c#

lambda表达式是一个匿名函数,您可以使用该函数来创建委托或表达式树类型 。通过使用lambda表达式 ,你可以写,可以作为 参数传递或返回函数调用的价值本地函数。 LAMBDA 表达式是写LINQ查询表达式 特别有帮助。要创建lambda表达式,可以在lambda运算符左侧指定输入 参数(如果有)=>,并且将表达式或语句块放在另一侧。对于 例如,lambda表达式X => X * X指定的参数这是 命名为x,并返回x的值的平方。

相关问题