a.Charge.Company.Name
是一个字符串
这是我的lambda表达式
var CompanyNameList = Prop.ChargeItems.SelectMany( a => a.Charge.Company.Name).ToList();
然而CompanyNameList
是List<char>
而非List<string>
... 为什么?
答案 0 :(得分:10)
您正在使用SelectMany
,这意味着投射另一个可枚举的枚举项的各个项目。 Company.Name
我假设是一个字符串,它是char
s。
您可能希望根据您的期望使用Select
。
答案 1 :(得分:4)
这是因为SelectMany,您可能需要选择此处。
SelectMany:将序列的每个元素投影到IEnumerable 并将得到的序列展平成一个序列。
在您致电SelectMany
之后,执行IEnumerable<char>
后,您获得ToList()
,List<char>
将其投放到{{1}}
答案 2 :(得分:3)
还有其他几个答案,但我想我会包含一个解释。
如果您查看String的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)
生成的集合将是由IEnumerable<char>
中包含的所有字符组成的Name
。
因此,在这种情况下,由于您实际上只是查找Name
个对象中包含的所有a.Charge.Company
字符串,因此您只需要使用Select
:
var CompanyNameList = Prop.ChargeItems.Select(a => a.Charge.Company.Name).ToList();