我一直在寻找一个解决方案,每个对象的属性转换上的列表一些阵列时终于让我找到this将对象列表转换为c#中的数组 - “x => x.Name”语法的含义是什么?
然后我发现这个代码
MyList.Select(x=>x.Name).ToArray();
这是解决我的问题。但我仍然不明白变量'x'的含义。任何人都可以简单地向我解释这个语法是如何工作的?
我一直在寻找一个解决方案,每个对象的属性转换上的列表一些阵列时终于让我找到this将对象列表转换为c#中的数组 - “x => x.Name”语法的含义是什么?
然后我发现这个代码
MyList.Select(x=>x.Name).ToArray();
这是解决我的问题。但我仍然不明白变量'x'的含义。任何人都可以简单地向我解释这个语法是如何工作的?
LINQ .Select<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector)
扩展方法需要一个Func,它接受一个参数并返回另一个(甚至相同)类型的对象/值。
您有几种方式来指定哪些函数来执行对您的枚举每个项目:
x => x.Name
:x
是输入参数,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
在最后一段代码中输入错字。在函数体中,你的意思是说x.Name。我投票了,因为你给所有可能的方式来传递参数来选择。 –
@ Khnle-Kevin:谢谢,我已经更新了我的问题。希望所有参数具有相同的名称并错过更新方法主体。 – knittl
lambda表达式是一个匿名函数,您可以使用该函数来创建委托或表达式树类型 。通过使用lambda表达式 ,你可以写,可以作为 参数传递或返回函数调用的价值本地函数。 LAMBDA 表达式是写LINQ查询表达式 特别有帮助。要创建lambda表达式,可以在lambda运算符左侧指定输入 参数(如果有)=>,并且将表达式或语句块放在另一侧。对于 例如,lambda表达式X => X * X指定的参数这是 命名为x,并返回x的值的平方。
x表示在MYLIST元件... –
在运算符左侧的x是对应于输入变量x在查询表达式中。 – CodingDefined
这是一个lambda表达式。请参阅https://msdn.microsoft.com/en-us/library/bb397687.aspx –