如何用LINQ查询从对象字段内的数组生成唯一对象列表?
用LINQ简化合并并去重多个文件中的签名者对象
你原来的代码可以用LINQ一步完成,不需要先把所有签名者加到临时集合里再去重,直接用SelectMany扁平化所有文件的签名者序列,再调用Distinct就能得到唯一的签名者数组:
var uniqueSigners = files.SelectMany(file => file.signers).Distinct().ToArray();
如果你的Signer对象默认的相等判断不符合需求(比如需要根据特定属性去重),可以给Distinct传入自定义的相等比较器:
// 先定义一个自定义比较器类 public class SignerEqualityComparer : IEqualityComparer<Signer> { public bool Equals(Signer x, Signer y) { // 这里根据你的需求实现相等判断逻辑,比如比较Id return x.Id == y.Id; } public int GetHashCode(Signer obj) { return obj.Id.GetHashCode(); } } // 然后使用 var uniqueSigners = files.SelectMany(file => file.signers) .Distinct(new SignerEqualityComparer()) .ToArray();
SelectMany的作用是把每个文件对应的signers数组展开成一个连续的Signer序列,之后Distinct会自动剔除重复项,最后用ToArray()转换成你需要的数组类型。
内容的提问来源于stack exchange,提问作者Marshal
相关产品推荐
相关产品推荐

