如何使用LINQ合并对象列表中的String[]字段并去重?
你可以用SelectMany配合Distinct一行搞定这个需求,代码比手动循环简洁得多,效率也不差:
var uniqueTags = productInfos.SelectMany(p => p.tags).Distinct().ToList();
代码说明:
SelectMany:把每个ProductInfo对象的tags数组"扁平化",将所有数组里的标签合并成一个连续的序列,省去了手动嵌套循环添加元素的步骤。Distinct():自动剔除序列里的重复标签,内部会用哈希表记录已出现的元素,去重效率很高。ToList():把最终的无重复序列转换成List<string>类型,和你原来的返回类型一致。
处理空值的健壮版写法
如果存在tags为null的ProductInfo对象,直接用上面的代码会抛出NullReferenceException,可以加个空值判断优化:
var uniqueTags = productInfos.SelectMany(p => p.tags ?? Array.Empty<string>()).Distinct().ToList();
完整示例代码
替换你原有的实现部分后,整体代码如下:
List<ProductInfo> productInfos = new List<ProductInfo>(); ProductInfo f1 = new ProductInfo(); f1.tags = new[] { "A","B","T","U"}; ProductInfo f2 = new ProductInfo(); f2.tags = new[] { "C","D","M","U" }; productInfos.Add(f1); productInfos.Add(f2); // LINQ实现 var uniqueTags = productInfos.SelectMany(p => p.tags).Distinct().ToList(); class ProductInfo { public String[] tags; }
这种写法在8000+对象的规模下完全适用,性能和手动循环相当,但代码可读性和维护性更好。
内容的提问来源于stack exchange,提问作者Mazzy
相关产品推荐
相关产品推荐

