如何向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
相关产品推荐
相关产品推荐

