3

我有一个像这样构建的元模型:

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的函数“比较”。我想过使用泛型,但泛型数据类型没有属性“id”。有任何想法吗?

4

3 回答 3

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;
    }
}

以下是指向此特定 SequenceEqual 覆盖IEqualityComparer 接口的 MSDN 链接。

于 2012-05-21T15:10:51.407 回答
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()。

于 2012-05-21T15:22:46.957 回答
0

Except带有自定义比较器的 Linq 之类的东西可能在这里工作:

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

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

于 2012-05-21T15:10:07.750 回答