2010-02-15 6 views
1

Voici un exemple de l'approche de l'architecture I Favorited premier que pour le moment:Quelle est la meilleure approche pour comparer une collection avec une autre (architecturellement parlant)?

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 
} 

Est-ce que cette approche de classe abstraite CollectionComparer être considérée comme une bonne pratique pour la comparaison de collecte pour un équivalent à Object.equals() appliquée à une collection?

+0

Merci à Daniel A. White et à "No Returns No Refunds" pour ces très bonnes réponses! Malheureusement, je peux définir une seule réponse comme la réponse. Considérant mon premier objectif de déterminer si la collection avait un comparateur d'égalité, la réponse de Daniel A. White est la meilleure. Désolé aucun retour Aucun remboursement! –

Répondre

2

Que diriez-vous la mise en œuvre IComparable et de l'appeler récursive pour chaque élément et chaque propriété d'élément? Il y a déjà une interface bien définie pour comparer les objets. Y at-il une raison pour laquelle vous ne voulez pas/ne pouvez pas l'utiliser?

+1

Honnêtement? Ignorance! = P Je n'ai jamais encore utilisé l'interface IComparable. Je suppose que je vais y jeter un œil. =) –

+1

'IComparable' est utilisé en interne par type de chaîne et numérique pour le tri. –

+0

Merci Daniel A. White pour cette information. J'aime apprendre de telles informations sur comment cela fonctionne sous le capot. –

Questions connexes