比较2个类对象并忽略1个(或更多)属性?

时间:2018-11-16 10:33:49

标签: c# class if-statement compare

所以我创建了一个像这样的类:

public class ClassName
{
public int ID;

public String n_1 {get; set; }
public String n_2 {get; set; }
// ....
public String n_x {get; set; }
}

稍后在我的代码中,我比较了2个ClassName对象:

ClassName Item_1 /*...*/ ;
ClassName Item_2 /*...*/ ;

赞:

if (Item_1 != Item_2 && Item_1.n_a == Item_2.n_a)
{
//do something
}

现在,我的问题是Item_1.IDItem_2.ID应该被忽略。有没有简单的方法可以做到这一点?我想出的唯一解决方案是“不费吹灰之力”

if ( (Item_1.n_1 != Item_2.n_1 || Item_1.n_2 != Item_2.n_2 || /* ... */ ) && Item_1.n_a == Item_2.n_a)

3 个答案:

答案 0 :(得分:1)

重写类中的object.Equals方法,并指定希望如何比较它。

然后使用!Item1.Equals(Item2)代替!=

https://docs.microsoft.com/en-us/dotnet/api/system.object.equals?view=netframework-4.7.2

答案 1 :(得分:1)

简单的方法就是您实际在做什么,只需创建一个这样的方法

    public bool Method(ClassName Item_1,ClassName Item2)
    {
    bool check=false;
    if ( (Item_1.n_1 != Item_2.n_1 || Item_1.n_2 != Item_2.n_2 || /* ... */ ) && Item_1.n_a == Item_2.n_a)
    check=true

return check
    }

答案 2 :(得分:1)

要执行类似Item_1 != Item_2Item_1 == Item_2的操作并获取所有要比较的属性(或所需属性),您需要实现自己的Equals方法和{{1} },==运算符重载。

!=运算符,来自 MSDN

  

对于不是字符串的引用类型,如果==的两个操作数引用同一对象,则==返回true。

为此,您可以从一些简单的解决方案开始,以实现==接口,在IEquatable<T>方法内部填充比较逻辑,并在内部重载Equals==运算符类型安全的!=方法:

Equals

然后您可以签入public class ClassName : IEquatable<ClassName> { public int ID; public String n_1 { get; set; } public String n_2 { get; set; } // .... public String n_x { get; set; } public static bool operator ==(ClassName obj1, ClassName obj2) { if (((object)obj1) == null || ((object)obj2) == null) return Equals(obj1, obj2); return obj1.Equals(obj2); } public static bool operator != (ClassName obj1, ClassName obj2) { if (((object)obj1) == null || ((object)obj2) == null) return !Equals(obj1, obj2); return !obj1.Equals(obj2); } public bool Equals(ClassName obj) { if (obj == null) return false; return (n_1 == obj.n_1) && (n_2 == obj.n_2) && (n_x == obj.n_x); //you can ignore ID here } public override bool Equals(object obj) { if (obj == null) return false; ClassName classNameObj = obj as ClassName; if (classNameObj == null) return false; else return Equals(classNameObj); } public override int GetHashCode() { //This code was generated by VS ide, you can write your own hashing logic var hashCode = 1032198799; hashCode = hashCode * -1521134295 + ID.GetHashCode(); hashCode = hashCode * -1521134295 + EqualityComparer<string>.Default.GetHashCode(n_1); hashCode = hashCode * -1521134295 + EqualityComparer<string>.Default.GetHashCode(n_2); hashCode = hashCode * -1521134295 + EqualityComparer<string>.Default.GetHashCode(n_x); return hashCode; } }

if

对于if (Item_1 != Item_2) { //Do Something } 方法,您应该坚持 Guidelines for Overriding Equals() and Operator ==

参考: == Operator != Operator IEquatable Interface {{3 }} IEquatable.Equals(T) Method