为什么我的 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>
......为什么?
您正在使用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();