You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 08:44:53