Maison >développement back-end >C++ >Comment puis-je comparer efficacement deux listes pour l'égalité, en ignorant l'ordre et en autorisant les doublons ?

Comment puis-je comparer efficacement deux listes pour l'égalité, en ignorant l'ordre et en autorisant les doublons ?

DDD
DDDoriginal
2025-01-21 07:37:10229parcourir

How Can I Efficiently Compare Two Lists for Equality, Ignoring Order and Allowing Duplicates?

Comparer la liste objets pour l'égalité

Cet article explique comment comparer deux objets List pour voir s'ils contiennent les mêmes éléments, quel que soit l'ordre des éléments. Il convient de noter que les objets de type MyType peuvent apparaître plusieurs fois dans n'importe quelle liste.

Plan initial

Pour assurer une égalité exacte, c'est à dire que les deux listes contiennent les mêmes éléments et leurs fréquences, il est recommandé de trier les listes avant de comparer :

<code class="language-C#">Enumerable.SequenceEqual(list1.OrderBy(t => t), list2.OrderBy(t => t))</code>

Plan d'optimisation

Cependant, afin d'améliorer les performances, quelqu'un a proposé une autre solution :

<code class="language-C#">public static bool ScrambledEquals<T>(IEnumerable<T> list1, IEnumerable<T> list2) {
  var cnt = new Dictionary<T, int>();
  foreach (T s in list1) {
    if (cnt.ContainsKey(s)) {
      cnt[s]++;
    } else {
      cnt.Add(s, 1);
    }
  }
  foreach (T s in list2) {
    if (cnt.ContainsKey(s)) {
      cnt[s]--;
    } else {
      return false;
    }
  }
  return cnt.Values.All(c => c == 0);
}</code>

Les performances de cette méthode sont nettement meilleures que la solution initiale. Elle ne nécessite que l'interface IEquatable et non l'interface IComparable.

Gestion de différents types de données

Afin de s'adapter à la situation consistant à contenir différents types de données (y compris les types nullables) comme clés, une solution améliorée peut être utilisée :

<code class="language-C#">public static bool ScrambledEquals<T>(IEnumerable<T> list1, IEnumerable<T> list2, IEqualityComparer<T> comparer) {
  var cnt = new Dictionary<T, int>(comparer);
  ...
}</code>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn