3

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

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

然而CompanyNameList不是……List<char>为什么List<string>

4

3 回答 3

11

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

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

于 2013-10-22T21:34:04.993 回答
4

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

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

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

于 2013-10-22T21:33:02.087 回答
3

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

如果您查看 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

由于SelectManywill 将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();
于 2013-10-22T21:46:46.977 回答