当前位置: 首页 > 知识库问答 >
问题:

C#如何比较Equals()-方法中的两个对象列表

公冶高峯
2023-03-14

我有两个具有相同元素和值的对象列表:

parameters = new List<Parameter>() { new Parameter() { parameterName="value", parameterType="string"} }

Parameter类如下所示:

 public class Parameter
    {
        public string parameterName;

        public string parameterType;
    }

我想通过单元测试将其与具有相同元素和值的相同对象列表进行比较。

我的Method类(我在Method对象之前创建,该对象存储了参数对象列表):

public class Method
{
   public List<Parameter> parameters { get; set;}

   public string modifier { get; set; }

   public string name { get; set; }

   public string type { get; set; }


   public override bool Equals(object obj)
        {
            return this.modifier == ((Method)obj).modifier && this.name == ((Method)obj).name && this.type == ((Method)obj).type
                && this.parameters == ((Method)obj).parameters; 
        }
}

我的问题是在Equals方法,在点this.parameters==...:

public override bool Equals(object obj)
        {
            return this.modifier == ((Method)obj).modifier && this.name == ((Method)obj).name && this.type == ((Method)obj).type
                && this.parameters == ((Method)obj).parameters; 
        }

顺便说一句,此方法中的所有其他条件都在工作。与对象相比,修饰符、名称和类型正在返回正确的值。因为这些是基本字符串值,比较要容易得多。当我想对对象列表做同样的事情时,它会变得更加复杂。

如何比较此Equals()方法中的两个参数对象列表,是否需要比较每个元素(如比较列表中所有对象的parameterName和parameterType)?

共有2个答案

江英华
2023-03-14

术语:“比较”和“相等”是两个不同的东西,比较意味着找出一个顺序(哪一个先出现),而相等只是测试是/否相等或不相等(身份)。

你必须自己定义平等对你意味着什么。{1; 2; 3}和{3; 2,1;}相同吗?你不仅要定义什么是相等的列表,还要定义什么是相等的参数。

您可以使用的比较列表

 parameters.SequenceEquals(((other)Method)).parameters);

如果订单对您很重要。

要比较参数本身,您必须覆盖参数的Equals,或者提供一个可以传递给SequenceEquals的自定义EqualityCompache。

实际上,这只不过是一个接一个地比较,然后打破第一个不匹配。

宗政英才
2023-03-14

您需要覆盖Parameter类中的Equals以及覆盖GetHashCode以维护哈希值(否则您将获得具有相同值的2个对象的不同哈希值)。

public class Parameter
{
    public string parameterName;

    public string parameterType;

    public override bool Equals(object obj)
    {
        return parameterName == ((Parameter) obj)?.parameterName &&
               parameterType == ((Parameter) obj)?.parameterType;
    }

    public override int GetHashCode()
    {
        unchecked
        {
            var hashCode = parameterName != null ? parameterName.GetHashCode() : 0;
            hashCode = (hashCode * 397) ^ (parameterType != null ? parameterType.GetHashCode() : 0);
            return hashCode;
        }
    }
}

然后在比较列表时使用序列相等

public class YourClass
{
    public List<Parameter> parameters { get; set; }

    public string modifier { get; set; }

    public string name { get; set; }

    public string type { get; set; }
    
    public override bool Equals(object obj)
    {
        return modifier == ((YourClass)obj)?.modifier && 
               name == ((YourClass)obj)?.name && 
               type == ((YourClass)obj)?.type && 
               ( parameters == null && ((YourClass)obj)?.parameters == null || 
                 parameters != null && ((YourClass)obj)?.parameters != null && parameters.SequenceEqual(((YourClass)obj).parameters));
    }
    
    public override int GetHashCode()
    {
        unchecked
        {
            var hashCode = parameters != null ? parameters.GetHashCode() : 0;
            hashCode = (hashCode * 397) ^ (modifier != null ? modifier.GetHashCode() : 0);
            hashCode = (hashCode * 397) ^ (name != null ? name.GetHashCode() : 0);
            hashCode = (hashCode * 397) ^ (type != null ? type.GetHashCode() : 0);
            return hashCode;
        }
    }
}
 类似资料:
  • 第一次来这里,所以我希望这是有意义的! 我有两个对象数组,比如l1和l2,我想在这两个列表之间进行比较,并在l3中得到一个不匹配的值。用户类包含2个字符串: 比如,l1包含:Java、JSF、JAXR、foo l2包含:JSF、JAXR 我可以对匹配的值进行比较,但不能对不匹配的值进行比较。这种逻辑似乎有缺陷。有什么帮助吗? 对于匹配值: 但是,对于不匹配,当我说不等于时,我得到的不是唯一的值,而

  • 我用一个字段构造了一个类。然后创建了两个对象,并且必须使用运算符和对它们进行比较。以下是我所做的:

  • 问题内容: 我有两个从同一类实例化的java对象。 如果我将它们的两个属性都设置为完全相同的值,然后验证它们是否相同 但是,这些方法都不返回真实值。我已经检查了每个属性,并且它们匹配。 如何比较这两个对象以验证它们是否相同? 问题答案: 你需要提供自己的实现。 如果哈希表中有可能使用你的对象,则还应该重写。一个合理的实施将是该对象的字段的哈希码喜欢的东西结合起来:

  • 在爪哇中。如果我们必须将一个对象与另一个对象进行比较。我们比较该对象中的每个字段。 学生 1 对象具有标记 1、标记 2、标记 3、名称、年龄作为字段。学生 2 对象具有标记 1、标记 2、标记 3、名称、年龄作为字段。因此,要检查2名学生是否相等...我们比较每个字段。 但是,如果 Student 对象有许多字段,该怎么办?学生1对象有标记1,标记2,标记3,名称,年龄,地址,颜色,类,国家,部

  • 问题内容: 我有两个列表 , 都包含 MyData 类型的对象,而 MyData* 包含这些变量。 利斯塔和数组listB都包含MyData的对象,现在我要两个列表的对象值比较这里 的名字 ,以及 检查 变量一样,如果 利斯塔 包含这些对象值 和ListB也包含 然后我必须比较列表并返回false,因为两个列表相同但是如果ListA包含 和 ListB 包含 然后我必须比较列表并返回true,因为