Какой подход лучше сравнить коллекцию с другой (с точки зрения архитектуры)? - PullRequest
1 голос
/ 15 февраля 2010

Вот пример архитектурного подхода, который я одобрил на данный момент:

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 (), примененного к коллекциям?

Ответы [ 2 ]

4 голосов
/ 15 февраля 2010

Вы видели это: SequenceEqual

http://msdn.microsoft.com/en-us/library/bb348567.aspx

2 голосов
/ 15 февраля 2010

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

...