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
Libérer: 2025-01-21 07:37:10
original
181 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal