将列表与自定义对象进行比较,自定义对象具有公共超类

时间:2012-05-21 15:08:29

标签: c# list comparison

我有一个像这样构建的Metamodel:

class ModelElement
{
    string id;
}

class Package : ModelElement
{
     List<Package> nestedPackages;
     List<Class> ownedClasses;
}

class Class : ModelElement
{
}

现在我已经构建了两个模型,我想检查它们是否相同。我想比较元素的ID,我不想为任何类型的元素编写方法。

Package a; //pretend both have classes
Package b; //and nested packages
compare(a.nestedPackages, b.nestedPackages);
compare(a.ownedClasses; b.OwnedClasses);

由于Class和Package都继承自ModelElement,因此它们都有ID。所以我想编写一个比较ID的函数“compare”。我想过使用Generics但是泛型数据类型没有属性“id”。有什么想法吗?

3 个答案:

答案 0 :(得分:4)

您可以查看Enumerable.SequenceEqual,并结合自定义比较器。

bool equal = Enumerable.SequenceEqual(a.nestedPackages, b.nestedPackages,
    new ModelElementComparer());

public class ModelElementComparer : IEqualityComparer<ModelElement>
{
    public bool Equals(ModelElement x, ModelElement y)
    {
        return x.id == y.id;
    }

    public int GetHashCode(ModelElement obj)
    {
        return x.id;
    }
}

以下是指向this particular SequenceEqual overrideIEqualityComparer interface

的MSDN链接

答案 1 :(得分:1)

您可以覆盖ModelElement类上的Object.Equals()方法,而不是编写比较方法

public override bool Equals(Object obj) 
{
   //Check for null and compare run-time types.
   if (obj == null || GetType() != obj.GetType()) 
      return false;
   ModelElement m = (ModelElement)obj;
   return (id == m.id);
}

如果你这样做,你还需要覆盖Object.GetHashCode()。

答案 2 :(得分:0)

像Linq的Except这样的自定义比较器可能会在这里工作:

http://msdn.microsoft.com/en-us/library/system.linq.enumerable.except.aspx

空的结果可枚举将意味着没有差异。