2012-05-21 2 views
3

У меня есть метамодель, который построен так:сравнение списков с пользовательскими объектами, которые имеют общий суперкласс

class ModelElement 
{ 
    string id; 
} 

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

class Class : ModelElement 
{ 
} 

Теперь я построил две модели, и я хочу, чтобы проверить, если они идентичны. Я хотел бы сравнить идентификаторы элементов, и я не хочу писать метод для любого типа элемента.

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

Поскольку класс и пакет оба наследуются от ModelElement, оба имеют идентификаторы. Поэтому я хочу написать функцию «сравнить», которая сравнивает идентификаторы. Я думал об использовании Generics, но общий тип данных не имеет атрибута «id». Есть идеи?

ответ

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

Вот ссылки на MSDN this particular SequenceEqual override и IEqualityComparer interface.

+0

Это работает для меня, теперь мне просто нужно прочитать документацию, чтобы понять, почему:) – twittfort

+0

Отредактировано для включения ссылок MSDN в документацию. :) –

1

Вместо того, чтобы писать метод сравнения, вы можете переопределить Object.Equals() метод на ModelElement класса

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(), а если вы это сделаете.

+0

Проблема в том, что метамодель дана, и мне не разрешено модифицировать. Иначе приятное решение. Спасибо. – twittfort

+0

Исправление: * Это не так. – twittfort

Смежные вопросы