使用LINQ从IEnumerable集合求和时遇CS1061错误的技术问询
问题描述
我希望使用LINQ从IEnumerable集合类中获取总和。我的集合类精简版本如下:
public class BrokerCcyValue { public string BrokerCode; public string CCY; public double Value; } public class BrokerCcyValues { private List<BrokerCcyValue> _items; public BrokerCcyValues() { _items = new List<BrokerCcyValue>(); }
...[包含添加/修改_items的方法,然后]...
public double SumForCcy(string cCCY) { var a = (from item in _items.AsEnumerable() where item.CCY == cCCY group item by item.CCY into grp select new { SumValue = grp.Sum(i => i.Value) }); return (double)a.SumValue; }
我参照网上示例编写了上述LINQ语句,但在return (double)a.SumValue;处出现设计时错误CS1061:“‘IEnumerable<>’不包含‘SumValue’的定义,也找不到接受‘IEnumerable<>’类型第一个参数的可访问扩展方法‘SumValue’”。请问如何取出我声明的匿名类型中的SumValue?是否有必要使用匿名类型?
解决方案
错误原因
变量a是IEnumerable<匿名类型>,而非单个匿名对象。分组后select返回的是一个序列(即便仅包含一个分组),因此直接访问a.SumValue会报错——序列本身没有该属性,只有序列内的元素才具备。
1. 取出匿名类型中SumValue的方法
若坚持使用匿名类型写法,需先从序列中获取单个元素,再访问其SumValue属性:
public double SumForCcy(string cCCY) { var result = (from item in _items.AsEnumerable() where item.CCY == cCCY group item by item.CCY into grp select new { SumValue = grp.Sum(i => i.Value) }).FirstOrDefault(); return result?.SumValue ?? 0; }
这里用FirstOrDefault()获取序列首个元素(因已通过where过滤指定CCY,分组后仅存在一个组),通过空值运算符?.安全访问SumValue,若结果为null则返回0,避免空引用异常。
2. 是否需要使用匿名类型?
完全不需要。你的需求仅为获取指定CCY的总和,无需额外封装为匿名类型,可大幅简化代码:
最简写法(无需分组)
通过where过滤指定CCY的元素后,直接求和即可:
public double SumForCcy(string cCCY) { return _items.Where(item => item.CCY == cCCY).Sum(item => item.Value); }
若需保留分组逻辑(如后续扩展需求)
也可直接返回分组的总和,无需匿名类型:
public double SumForCcy(string cCCY) { return _items.AsEnumerable() .Where(item => item.CCY == cCCY) .GroupBy(item => item.CCY) .Sum(grp => grp.Sum(item => item.Value)); }
但此写法冗余,因过滤后仅存在一个分组,优先选择最简写法更高效。
内容的提问来源于stack exchange,提问作者Mark Roworth
相关产品推荐
相关产品推荐

