順序なしリスト
2 つの List
各要素の出現数が重要な場合、簡単な解決策は、比較する前に両方のリストを並べ替えることです。
<code class="language-csharp">Enumerable.SequenceEqual(list1.OrderBy(t => t), list2.OrderBy(t => t))</code>
IEquatable 要素の最適化ソリューション
(IComparable ではなく) IEquatable インターフェイスを実装するだけでよい要素の場合、より効率的なアプローチがあります。
<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>
このスキームは、最初のリスト内の各要素の出現数をカウントし、その出現数を 2 番目のリストから減算します。各カウントがゼロに達すると、2 つのリストは等しいとみなされます。
カスタムキータイプの処理
要素の型が比較できない場合 (null 許容型など)、辞書のコンパレータを指定できます:
<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>
以上がC# で 2 つの順序なしリストを効率的に比較して等しいかどうかを確認するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。