3

私はこのように構築されたメタモデルを持っています:

class ModelElement
{
    string id;
}

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

class Class : ModelElement
{
}

これで2つのモデルを作成しましたが、それらが同一であるかどうかを確認したいと思います。要素の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を使用することを考えましたが、genericデータ型には属性「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 に答える