Comparer les objets de liste non ordonnée
Déterminer si deux objets List
Si le nombre d'occurrences de chaque élément est important, une solution simple est de trier les deux listes avant de comparer :
<code class="language-csharp">Enumerable.SequenceEqual(list1.OrderBy(t => t), list2.OrderBy(t => t))</code>
Solution d'optimisation pour les éléments IEquatable
Pour les éléments qui nécessitent uniquement d'implémenter l'interface IEquatable (au lieu de IComparable), il existe une approche plus efficace :
<code class="language-csharp">public static bool ScrambledEquals<T>(IEnumerable<T> list1, IEnumerable<T> list2) { var cnt = new Dictionary<T, int>(); foreach (T s in list1) { cnt[s] = cnt.GetValueOrDefault(s, 0) + 1; } foreach (T s in list2) { if (cnt.ContainsKey(s)) cnt[s] -= 1; else return false; } return cnt.Values.All(x => x == 0); }</code>
Ce schéma compte le nombre d'occurrences de chaque élément dans la première liste puis soustrait le nombre d'occurrences de la deuxième liste. Les deux listes sont considérées comme égales si chaque décompte atteint zéro.
Gestion des types de clés personnalisés
Si les types d'éléments ne sont pas comparables (par exemple, les types nullables), vous pouvez spécifier un comparateur pour le dictionnaire :
<code class="language-csharp">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!