在C#中将对象列表转换为数组 - “x => x.Name”语法是什么意思?

15 浏览
0 Comments

在C#中将对象列表转换为数组 - “x => x.Name”语法是什么意思?

这个问题已经有答案了:

C# Lambda表达式:我为什么要使用它们?

我正在寻找将列表中每个对象的属性转换为数组的解决方案,最终我找到了这个

然后,我找到了这段代码

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

这是解决我的问题的方法。但我仍然不理解变量\'x\'代表什么。有人能够简要解释一下这个语法是如何工作的吗?

admin 更改状态以发布 2023年5月21日
0
0 Comments

这是一个C#中的lambda表达式

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

0
0 Comments

LINQ .Select(this IEnumerable source, Func 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的实例,因此任何可以被迭代/枚举的类型(大多数是集合)都可以使用。 .Select()用于将类型为 IEnumerable 的一个可枚举转换为类型为 IEnumerable 的另一个可枚举。注意,作为参数传递给.Select()selector函数只有在可枚举的情况下才被执行(通过使用foreach.ToList().ToArray()或其他方式)。

使用LINQ,您更加关注于数据为中心的视角,不用管`.Select()`内部使用foreach、for或任何其他方法来获取集合项目,甚至可以并行处理操作(`.AsParallel`)。

当然,大多数LINQ调用都可以用简单的代码重写,例如:

var nameList = List(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