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

如何向List<IGrouping<string, MyItemDTO>>集合添加分组对象?

解决手动向List<IGrouping<string, MyItemDTO>>添加分组的问题

你说得对,IGrouping<TKey, TElement>是接口,没法直接通过new实例化。不过有两种实用的办法可以解决这个问题,我给你详细说明:

方法1:自定义实现IGrouping的类

.NET框架内部有个Grouping类实现了IGrouping,但它是内部类我们没法直接调用,所以自己写一个简易实现就行:

public class MyGrouping<TKey, TElement> : IGrouping<TKey, TElement>
{
    private readonly IEnumerable<TElement> _elements;

    public MyGrouping(TKey key, IEnumerable<TElement> elements)
    {
        Key = key;
        _elements = elements ?? Enumerable.Empty<TElement>();
    }

    public TKey Key { get; }

    public IEnumerator<TElement> GetEnumerator()
    {
        return _elements.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

有了这个类,你就能轻松创建新分组并添加到列表里:

// 准备要加入新分组的项
var newItems = new List<MyItemDTO>
{
    new MyItemDTO { /* 填充你的实体属性 */ },
    new MyItemDTO { /* 填充你的实体属性 */ }
};

// 创建新分组实例
var newGroup = new MyGrouping<string, MyItemDTO>("新分组的Key值", newItems);

// 添加到列表(如果原列表是只读的,先转成可写List:MyList = MyList.ToList())
MyList.Add(newGroup);

方法2:用LINQ的GroupBy临时生成分组

如果你不想写自定义类,可以借助LINQ的GroupBy方法生成符合IGrouping规范的实例——因为GroupBy返回的结果本身就是IGrouping的实现:

// 单个元素创建新分组
var singleItem = new MyItemDTO { /* 填充属性 */ };
var newGroup = new List<MyItemDTO> { singleItem }
    .GroupBy(item => "新分组的Key")
    .FirstOrDefault();

if (newGroup != null)
{
    MyList.Add(newGroup);
}

// 多个元素创建新分组
var multipleItems = new List<MyItemDTO> { /* 批量填充项 */ };
var anotherGroup = multipleItems.GroupBy(item => "另一组的Key").FirstOrDefault();
if (anotherGroup != null)
{
    MyList.Add(anotherGroup);
}

额外注意

如果你的MyList是直接从数据库IQueryable分组后得到的,它可能是只读集合(比如ReadOnlyCollection),直接调用Add会报错。这时候需要先把它转为可写的List:

MyList = MyList.ToList();

内容的提问来源于stack exchange,提问作者Offer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:00:35