如何不使用循环或Select实现两个Node列表的完全匹配?
问题描述
我创建了两个node对象列表,代码如下:
var inputNodes = new List<nodes>() { new node() { nodeName= "D100", DataLength = 1 }, new node() { nodeName= "D101", DataLength = 1 }, new node() { nodeName= "D102", DataLength = 1 }, new node() { nodeName= "D103", DataLength = 1 }, new node() { nodeName= "D104", DataLength = 1 }, new node() { nodeName= "D105", DataLength = 1 }, new node() { nodeName = "D106", DataLength = 1 } }; var inputNodes2 = new List<nodes>() { new node() { nodeName= "D100", DataLength = 1 }, new node() { nodeName= "D101", DataLength = 1 }, new node() { nodeName= "D102", DataLength = 1 }, new node() { nodeName= "D103", DataLength = 1 }, new node() { nodeName= "D104", DataLength = 1 }, new node() { nodeName= "D105", DataLength = 1 }, new node() { nodeName= "D106", DataLength = 1 } };
尝试使用var isEqual = inputNodes.SequenceEqual(inputNodes2)判断是否完全匹配,但返回false。不想使用循环或List.Select方法,请问有什么解决思路?
解决思路
- 重写node类的Equals和GetHashCode方法:引用类型默认比较的是对象引用地址,而非属性值。重写这两个方法后,让比较逻辑基于
nodeName和DataLength属性,SequenceEqual就能正确判断元素是否相等。示例代码:
public class node { public string nodeName { get; set; } public int DataLength { get; set; } public override bool Equals(object obj) { if (obj is node otherNode) { return nodeName == otherNode.nodeName && DataLength == otherNode.DataLength; } return false; } public override int GetHashCode() { return HashCode.Combine(nodeName, DataLength); } }
- 使用SequenceEqual的重载版本,传入自定义比较器:如果不想修改原node类,可创建实现
IEqualityComparer<node>的比较器,将其作为参数传给SequenceEqual,实现按属性值比较元素。示例代码:
public class NodeComparer : IEqualityComparer<node> { public bool Equals(node x, node y) { if (x == null || y == null) return x == y; return x.nodeName == y.nodeName && x.DataLength == y.DataLength; } public int GetHashCode(node obj) { return obj == null ? 0 : HashCode.Combine(obj.nodeName, obj.DataLength); } } // 调用方式 var isEqual = inputNodes.SequenceEqual(inputNodes2, new NodeComparer());
内容的提问来源于stack exchange,提问作者Emily
相关产品推荐
相关产品推荐

