【发布时间】:2021-12-16 12:35:01
【问题描述】:
我有这门课(为便于阅读而简化)
public class Customer
{
public string Id {get;set;}
public Email[] Emails {get;set;}
}
从外部系统我得到一个带有Customers 的列表,其中可以包含多个 行,用于相同 Customer (ID)
原始输入 JSON
[
{id: a1, emails:[a,b,c]},
{id: a1, emails:[d]},
{id: b3, emails:[e,f]},
{id: k77, emails:[z,a]}
]
获取客户的 c# 代码
List<Customer> dataInput = CallToExternalService(...);
我想通过 LINQ 生成一个Customers 的唯一 列表,其中包含所有客户电子邮件的合并 列表。
我知道如何获取唯一客户列表
dataInput.GroupBy(x => x.id).Select(x => x.First()).ToList();
但我正在努力解决如何将每个客户的电子邮件列表合并为一个。性能也是一个重要因素,因为数据将包含 10k+ 项并且需要每小时运行一次。
我尝试了很多,Select 和 SelectMany 是不错的候选者,但我不知道如何合并列表,更不用说将这个合并的列表带回 x.First() 项目。
元代码:
dataInput
.GroupBy(x => x.id)
.ForEachGroup(y => group.First().Emails = MergeLists(y.Emails;)
.Select(z => z.First()),ToList();
预期的最终结果 C# 列表
id: a1, emails:[a,b,c,d]
id: b3, emails:[e,f]
id: k77, emails:[z,a]
【问题讨论】:
-
使用
.SelectMany(x => x.Take(1))比使用.Select(x => x.First())更好——主要是当您修改查询时它更健壮。 -
所以澄清一下:您的输入可能有多个具有相同
Id值的项目,并且它可以包括具有相似值的电子邮件,并且您希望得到一个对象列表,其中 @ 987654336@ 值是不同的,每个条目中的Email集合仅包含与其Id关联的不同电子邮件值? -
当您说“可以包含多行”时,您的意思是“可以包含多封电子邮件”吗?
-
@StriplingWarrior 很抱歉造成混乱。是与否。具有相同 ID 的多个项目是的。无需对电子邮件进行重复检查。
-
@Enigmativity 很抱歉造成混淆,只会有重复的 ID。不是电子邮件