EqualityComparer<T>.Par défaut contre T. est Égal à

Supposons que j'ai un générique MyClass<T> qui doit comparer deux objets de type <T>. Habituellement, je ferais quelque chose comme ...

void DoSomething(T o1, T o2)
{
  if(o1.Equals(o2))
  {
    ...
  }
}

Supposons maintenant que mon MyClass<T> a un constructeur qui prend en charge le passage d'un personnalisé IEqualityComparer<T>, semblable à Dictionnaire<T>. Dans ce cas, j'avais besoin de le faire ...

private IEqualityComparer<T> _comparer;
public MyClass() {}
public MyClass(IEqualityComparer<T> comparer)
{
  _comparer = comparer;
}
void DoSomething(T o1, T o2)
{
  if((_comparer != null && _comparer.Equals(o1, o2)) || (o1.Equals(o2)))
  {
    ...
  }
}

Pour supprimer cette longue si l'instruction, ce serait bien si je pouvais avoir _comparer par défaut à un "comparateur par défaut" si la régulière constructeur est utilisé. J'ai cherché quelque chose comme typeof(T).GetDefaultComparer(), mais n'était pas en mesure de trouver quelque chose comme ça.

Je n'ai trouver EqualityComparer<T>.Default, pourrais-je l'utiliser? Puis cet extrait ...

public MyClass()
{
  _comparer = EqualityComparer<T>.Default;
}
void DoSomething(T o1, T o2)
{
  if(_comparer.Equals(o1, o2))
  {
    ...
  }
}

... fournir les mêmes résultats que l'utilisation de o1.Equals(o2) pour tous les cas possibles?

(Comme une note de côté, serait-ce à dire que j'avais aussi besoin d'utiliser toute spéciale contrainte générique pour <T>?)

  • Remarque: Si o1 est null, o1.Equals(o2) échoue à l'omniprésence de la NullReferenceException, alors que EqualityComparer<T>.Default.Equals(o1, o2) sera heureux de retourner false.
  • C'est pourquoi j'ai dit "j'aimerais faire quelque chose comme ...", et pas "Voici mon code de production ..." 😉
InformationsquelleAutor takrl | 2011-05-02