在c#中将对象列表转换为数组-“x => x.Name”语法是啥意思? [复制]

Posted

技术标签:

【中文标题】在c#中将对象列表转换为数组-“x => x.Name”语法是啥意思? [复制]【英文标题】:converting list of object to array in c# - what does the "x => x.Name" syntax mean? [duplicate]在c#中将对象列表转换为数组-“x => x.Name”语法是什么意思? [复制] 【发布时间】:2015-08-25 04:31:47 【问题描述】:

当我最终找到this时,我一直在寻找将列表中每个对象的属性转换为一些数组的解决方案

然后我找到了这段代码

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

这是我的问题的解决方案。但我仍然不明白变量“x”是什么意思。谁能简要地向我解释一下这种语法是如何工作的?

【问题讨论】:

x 表示 MyList 中的元素... 运算符左边的x为输入变量,对应查询表达式中的x。 这是一个 lambda 表达式。请参考msdn.microsoft.com/en-us/library/bb397687.aspx 【参考方案1】:

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> 类型的枚举。请注意,作为参数传递给.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

【讨论】:

最后一个代码 sn-p 中的错字。在函数体中,您的意思是说 x.Name。我投了赞成票,因为您提供了将参数传递给选择的所有可能方式。 @Khnle-Kevin:谢谢,我已经更新了我的问题。希望所有参数具有相同的名称并且错过了更新方法体。【参考方案2】:

这是lambda expression in c#。

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

【讨论】:

以上是关于在c#中将对象列表转换为数组-“x => x.Name”语法是啥意思? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中将对象数组转换为浮点数组 [关闭]

如何在c#中将对象转换为数组? [关闭]

在 C# 中将对象数组隐式转换为 int 数组

如何在 C# 中将对象数组向上转换为另一种类型的对象数组?

在 C# 中将通用列表转换为数据集 [关闭]

在 C# 中将字符串拆分为字符串数组列表