a.Charge.Company.Name
是一个字符串,这是我的 lambda 表达式
var CompanyNameList = Prop.ChargeItems.SelectMany( a => a.Charge.Company.Name).ToList();
然而CompanyNameList
不是……List<char>
为什么?List<string>
您正在使用SelectMany
,这意味着投影另一个可枚举的单个项目。Company.Name
我假设是一个字符串,它是char
s 的集合。
根据您的期望,您可能只想使用Select
。
这是因为SelectMany,您可能需要在此处选择。
SelectMany:将序列的每个元素投影到 IEnumerable 并将结果序列展平为一个序列。
所以执行SelectMany
你得到IEnumerable<char>
,在你调用之后ToList()
,它将它投射到一个List<char>
还有其他一些答案,但我想我会包括一个解释。
如果您查看 MSDN 对String的定义,您会发现它被实现为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
will 将String
视为一个IEnumerable<char>
对象,我们可以推断出结果集合 from.SelectMany(x => x.Name)
将由 中IEnumerable<char>
包含的所有字符组成Name
。
因此,在这种情况下,由于您实际上只是在查找对象Name
中包含的所有字符串a.Charge.Company
,因此您实际上只需要使用Select
:
var CompanyNameList = Prop.ChargeItems.Select(a => a.Charge.Company.Name).ToList();