a.Charge.Company.Name是一个字符串,这是我的 lambda 表达式
var CompanyNameList = Prop.ChargeItems.SelectMany( a => a.Charge.Company.Name).ToList();
然而CompanyNameList不是……List<char>为什么?List<string>
您正在使用SelectMany,这意味着投影另一个可枚举的单个项目。Company.Name我假设是一个字符串,它是chars 的集合。
根据您的期望,您可能只想使用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)
由于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();