如何用LINQ检查两个List<B>中内嵌List<A>的所有字段是否匹配?
问题分析与修正方案
原模型代码
class A { public string Value { get; set; } public int? bId { get; set; } public B b { get; set; } } class B { public int Id { get; set; } public List<A> aList { get; set; } public B () { aList = new List<A>(); } }
原方法存在的问题
- 循环内每次都会覆盖
q集合,最终仅保留最后一次循环的结果,无法正确记录所有匹配情况 - 仅对比了
A类的Value字段,未覆盖bId等其他需要检查的字段 - 逻辑与需求不符:原代码仅找出两个
aList中Value相同的元素,未实现“对比每个B对象内嵌List所有字段”的目标
修正后的实现
第一步:为A类实现值相等判断
因为引用类型默认按引用判断相等,我们需要自定义值相等逻辑,覆盖所有需要对比的字段:
class A : IEquatable<A> { public string Value { get; set; } public int? bId { get; set; } public B b { get; set; } // 自定义值相等判断逻辑 public bool Equals(A other) { if (other == null) return false; // 仅对比值类型/字符串字段,避免B对象的循环引用问题 return string.Equals(Value, other.Value) && bId == other.bId; } public override bool Equals(object obj) { return Equals(obj as A); } // 配套重写GetHashCode,保证相等判断的一致性 public override int GetHashCode() { return HashCode.Combine(Value, bId); } } class B { public int Id { get; set; } public List<A> aList { get; set; } public B() { aList = new List<A>(); } }
第二步:修正对比方法
根据需求(两个List对应位置的B对象,其内嵌List的所有字段完全匹配),实现如下:
bool checkingDuplicatedObjects(List<B> b1, List<B> b2) { // 先判断集合总数是否一致 if (b1.Count != b2.Count) return false; // 遍历每个对应位置的B对象 for (int i = 0; i < b1.Count; i++) { var bItem1 = b1[i]; var bItem2 = b2[i]; // 先判断aList元素数量是否一致 if (bItem1.aList.Count != bItem2.aList.Count) return false; // 判断两个aList是否完全匹配(顺序一致用SequenceEqual;不关心顺序则用HashSet的SetEquals) if (!bItem1.aList.SequenceEqual(bItem2.aList)) return false; } // 所有对应位置的B对象的aList均匹配 return true; }
内容的提问来源于stack exchange,提问作者Bahman
相关产品推荐
相关产品推荐

