2010-02-15 6 views
1

Вот пример архитектуры подхода я Избраный, как сейчас:Каков лучший способ сравнить коллекцию с другим (архитектурно-говорящим)?

public abstract class CollectionComparer { 
    public virtual SetEqual(IEnumerable enum1, IEnumerable enum2) { 
     if(enum1== null && enum2== null) 
      return true; 

     if(enum1== null && !(enum2== null)) 
      return false; 

     if(!(enum1== null) && enum2== null) 
      return false; 

     if(enum1.GetType().DeclaringType != enum2.GetType().DeclaringType) 
      return false; 

     var col1 = (from e in enum1 select e).ToList() 
     var col2 = (from e in enum2 select e).ToList() 

     if(col1.Count != col2.Count) 
      return false;   

     foreach (element in col1) 
      if(!col2.Contains(element)) 
       return false; 

     foreach (element in col2) 
      if(!col1.Contains(element)) 
       return false; 

     return true; 
    } 
} 

public interface IProduct { 
    ... 
} 

public interface IOrder { 
    ... 
    ICustomer Customer { get; } 
    ICollection<IProduct> Products { get; } 
} 

public interface ICustomer { 
    ... 
    ICollection<IOrder> Orders { get; } 
} 

public internal Order : CollectionComparer, IOrder { 
    #region IOrder interface implementation 
    ... 
    #endregion 
} 

public internal Customer : CollectionComparer, ICustomer { 
    #region ICustomer interface implementation 
    ... 
    #endregion 
} 

ли это CollectionComparer абстрактного класс подход считается хорошей практикой для сравнения сбора за эквивалент Object.equals(), примененного к коллекции?

+0

Спасибо и Daniel A. White и «No Returns No Refunds» за эти очень отличные ответы! К сожалению, я могу задать только один ответ в качестве ответа. Учитывая мою первую цель - определить, имеет ли сборник сравнительный коэффициент равенства, ответ Даниэля А. Уайта является лучшим. Извините, нет возвратов Нет возврата! –

ответ

2

Как насчет реализации IComparable и назвав его рекурсивно для каждого элемента и каждого свойства элемента? Существует уже определенный интерфейс для сравнения объектов. Есть ли причина, по которой вы не хотите/не можете ее использовать?

+1

Честно? Невежество! = P Я еще никогда не использовал интерфейс IComparable. Думаю, я посмотрю на это. =) –

+1

'IComparable' используется внутренне строковыми и числовыми типами для сортировки. –

+0

Поблагодарите Daniel A. White за эту информацию. Мне нравится узнавать такую ​​информацию о том, как она работает под капотом. –