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

时间:2013-10-22 21:30:52

标签: c# linq lambda

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

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

然而CompanyNameListList<char>而非List<string> ... 为什么?

3 个答案:

答案 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();