如何比较两个复杂对象?

问题描述:

我想自己写一个List。 所以我有一个类List和类ListItem。 我现在想要做的是创建不同类,例如类car。我想从类ListItem中推导出类car,以便我可以创建一个List汽车。 现在类List应该有不同的方法,就像一个C#给你的。 我写了一个Add和一个Count方法,并且都可以工作。 这里是棘手的部分...我想写一个函数来查找列表中的项目。问题是我不能仅仅比较它们,因为1.我不知道对象将是什么样子以及它会有什么成员。 2.我不想比较类ListItem的特征,因为它们与真实对象无关,它们只与List有关。如何比较两个复杂对象?

我的想法是,为每个对象创建一个列表类,所以在我的例子中,它将是一个从列表类推导出来的carList。这样我就可以编写一个Methode来知道要比较的内容,因为它可以知道ListItem对象。现在我不想为每个想要列表的对象创建一个列表类。必须有不同的方式sice c#也给你相同的列表类。 任何人都可以帮忙吗?

+1

您的问题是“任何人都可以帮忙吗?” - 答案显然是“是的,有人可以帮忙”。但是,请分享一下你所拥有的东西,帮助你更轻松地帮助你。 – Dietz

+0

@fubo我不知道你的意思......当然,我把这个对象作为一个超载来搜索我的函数! –

+0

你可以给我们提供'Find'方法的方法签名吗?会不会有'Contains'方法。 – Gusdor

你应该在你的Car -class覆盖Equals(从object继承):然后

class car 
{ 
    public override bool Equals(object other) { 
     var o = other as car; 
     if (o == null) return false; 

     if this.myProperty = o.myProperty return true; 

     return false; 
    } 
} 

名单将使用此implenentation因为如果两辆车都是平等的检测。在您Find - 方法现在您只需在列表中要求每一个项目,如果它等于一个搜索:

if (currentItemInList.Equals(searchItem)) // ... 

编辑:当任何类实现Equals你应该总是在同样的情况下实现GetHashCode的的对象你类存储在散列容器中,如Dictionary<TKey,TValue>。如果您想进一步阅读,请参阅MSDN for GetHashCode and Equals

+0

如果你自己编写整个列表实现,你可以用任何你喜欢的方式来命名比较方法,因为你是谁来调用它们。如果可能发生的事情是,你的对象最终在通用容器中,但你应该实现'IEquatable ',除了'object.Equals()'。参看https://msdn.microsoft.com/en-us/library/ms131187%28v=vs.110%29.aspx。你当然也应该实现'GetHashCode()'。 –

+0

@PeterSchneider当然你是对的,但我试图保持简单。我也添加了HashCode。 – HimBromBeere

+0

嗯......我认为'GetHashCode()'只对字典和可能的其他散列容器很重要,但对于一般的相等性测试来说不重要。 –