将对象列表转换为数组"x =>x.Name"语法的意思

本文关键字:quot Name 语法 意思 对象 数组 转换 列表 | 更新日期: 2023-09-27 17:54:42

我正在寻找一种解决方案,将每个对象的属性转换为列表上的一些数组,当最后我发现这个

然后我发现了这个代码

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

这是我的问题的解决方案。但我还是不明白变量x是什么意思。谁能给我简单解释一下这个语法是如何工作的?

将对象列表转换为数组"x =>x.Name"语法的意思

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

有几种方法可以指定对枚举对象中的每个项执行哪个函数:

  • Lambda表达式:您在问题中发布的内容。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>类型的可枚举对象。注意,作为参数传递给.Select()selector函数只有在枚举对象被枚举(通过foreach.ToList().ToArray()或其他)之后才会被执行。

使用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

这是c#中的lambda表达式。

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