C# 使用LINQ按Customer ID分组并合并同组的Emails子列表
实现代码
你可以在分组后直接合并同组所有Customer的Emails数组,再构造新的Customer对象即可,万级数据量下该方案性能完全满足每小时执行一次的要求,整体时间复杂度为O(n):
List<Customer> mergedCustomers = dataInput .GroupBy(customer => customer.Id) .Select(group => new Customer { Id = group.Key, // 不需要去重邮箱直接用这行 Emails = group.SelectMany(item => item.Emails).ToArray() // 如果需要对同ID下的重复邮箱去重,替换为下面这行 // Emails = group.SelectMany(item => item.Emails).Distinct().ToArray() }) .ToList();
补充说明
- 如果你需要复用分组后的第一个Customer实例而非新建对象,可以采用下面的写法,注意该写法会修改原始集合中对应实例的属性值,如果原始数据还有其他用途不推荐使用:
List<Customer> mergedCustomers = dataInput .GroupBy(customer => customer.Id) .Select(group => { var firstCustomer = group.First(); firstCustomer.Emails = group.SelectMany(item => item.Emails).ToArray(); return firstCustomer; }) .ToList();
- 1万条规模的数据处理耗时在毫秒级,无需额外性能优化。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

