ホームページ >バックエンド開発 >C++ >C# で 2 つの順序なしリストを効率的に比較して等しいかどうかを確認するにはどうすればよいですか?

C# で 2 つの順序なしリストを効率的に比較して等しいかどうかを確認するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2025-01-21 07:52:08691ブラウズ

How Can I Efficiently Compare Two Unordered Lists for Equality in C#?

順序なしリスト オブジェクトが等しいかどうかを比較

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。