为什么我的 lambda 表达式是一个字符

本文关键字:一个 字符 我的 lambda 表达式 为什么 | 更新日期: 2023-09-27 18:36:31

a.Charge.Company.Name是一个字符串这是我的 lambda 表达式

var CompanyNameList = Prop.ChargeItems.SelectMany( a => a.Charge.Company.Name).ToList();

然而,CompanyNameList是一个不List<string> List<char>......为什么?

为什么我的 lambda 表达式是一个字符

您正在使用SelectMany,这意味着投影另一个可枚举的可枚举项的单个项。 Company.Name我假设是一个字符串,它是char的集合。

您可能只想根据您的期望使用Select

这是因为 SelectMany,您可能需要在此处选择。

SelectMany:将序列的每个元素投影到 IEnumerable 并将生成的序列展平为一个序列。

所以执行SelectMany你会得到IEnumerable<char>,在你调用ToList()之后,它会把它投影到一个List<char>

还有其他一些答案,但我想我会包括一个解释。

如果您查看字符串的 MSDN 定义,您会发现它是作为IEnumerable<char>实现的:

[SerializableAttribute]
[ComVisibleAttribute(true)]
public sealed class String : IComparable, 
    ICloneable, IConvertible, IComparable<string>, IEnumerable<char>, 
    IEnumerable, IEquatable<string>

然后,将其与 SelectMany 的定义进行比较:

将序列的每个元素投影到 IEnumerable 中,并将生成的序列平展为一个序列

(这里有一个很好的视觉解释:http://www.codethinked.com/a-visual-look-at-the-linq-selectmany-operator)

由于SelectMany会将String视为IEnumerable<char>对象,我们可以推断,从.SelectMany(x => x.Name)生成的集合将是一个由Name中包含的所有字符组成的IEnumerable<char>

因此,

在这种情况下,由于您实际上只查找a.Charge.Company对象中包含的所有Name字符串,因此您实际上只需要使用 Select

var CompanyNameList = Prop.ChargeItems.Select(a => a.Charge.Company.Name).ToList();