如何解决将List <T>的C#集合与List <IGrouping <T >>合并
我正在尝试将这两个集合合并为一个列表,但是其中一个集合是List<IGrouping<T>>
。我正在尝试将groupedSubscriptions
(是List<IGrouping<int,Subscription>>
)与ListOfSubscriptionsSecond
(是List<Subscription>
)合并以创建FullListOfSubscriptions
,最后,一个List<Subscription>
。请参见下面的代码示例。
我遇到了编译时错误:
严重性代码描述项目文件行抑制状态抑制状态 错误CS1503参数1:无法从'System.Collections.Generic.IEnumerable
>'转换为'System.Collections.Generic.IEnumerable '
我正在尝试的逻辑示例
List<Subscription> FullListOfSubscriptions = new List<Subscription>();
List<Subscription> ListOfSubscriptions = new List<Subscription>();
ListOfSubscriptions.Add(new Subscription() { SubscriptionId = 1,ParentProductId = 4,ChildProductId = 4,ParentProductName = "Product 1",ChildProductName = "Product 1",GroupId = 362 });
ListOfSubscriptions.Add(new Subscription() { SubscriptionId = 2,ParentProductId = 114,ChildProductId = 1,ParentProductName = "Product 2",ChildProductName = "Product 3",GroupId = 1 });
ListOfSubscriptions.Add(new Subscription() { SubscriptionId = 3,ChildProductId = 2,ChildProductName = "Product 4",GroupId = 1 });
var groupedSubscriptions = ListOfSubscriptions.GroupBy(u => u.GroupId);
var flattenedSubscriptions = groupedSubscriptions.SelectMany(grp => grp.AsEnumerable()).ToList();
List<Subscription> ListOfSubscriptionsSecond = new List<Subscription>();
ListOfSubscriptionsSecond.Add(new Subscription() { SubscriptionId = 4,GroupId = 362 });
ListOfSubscriptionsSecond.Add(new Subscription() { SubscriptionId = 5,GroupId = 1 });
ListOfSubscriptionsSecond.Add(new Subscription() { SubscriptionId = 6,GroupId = 1 });
//FullListOfSubscriptions = ListOfSubscriptionsSecond.AddRange(groupedSubscriptions);
FullListOfSubscriptions = groupedSubscriptions
.SelectMany(grp => grp.AsEnumerable())
.Concat(ListOfSubscriptionsSecond); // <<= I'm getting error here
解决方法
真的取决于您要做什么。假设您有一个像下面这样的课程
public class Employee
{
public string Department { get; set; }
public string Name { get; set; }
}
然后您可以像合并
public IEnumerable<Employee> Merge(IEnumerable<Employee> employees,IEnumerable<IGrouping<string,Employee>> employeesByDept)
{
// Just merge all employees
return employeesByDept
.SelectMany(grp => grp.AsEnumerable()) // flatten
.Concat(employees); // concat the other
}
如果要将整个集合合并为IGrouping
,可以有很多方法,其中一种只是将已经分组的分组变平,concat
将另一组分组并再次分组。
public IEnumerable<IGrouping<string,Employee>> MergeGroup(IEnumerable<Employee> employees,Employee>> employeesByDept)
{
return employeesByDept
.SelectMany(grp => grp.AsEnumerable()) // flatten
.Concat(employees) // concat the other
.GroupBy(e => e.Department); // group again
}
在这里没有几个要了解的问题:
- IEnumerable是一个高级集合接口,大多数集合(如果不是全部)都可以实现。这些仅用于迭代,即遍历收集和读取数据。它不允许进行任何形式的修改。
- List是
IEnumerable
的常用实现,它是一个具体的类,还支持修改。 - 可以将
List<T>
分配给IEnumerable<T>
,反之亦然。了解Covariance and Contravariance。 - 并了解IGrouping。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。