You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何不使用循环或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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 00:25:28