首頁 > 後端開發 > C++ > 如何在 C# 中有效比較兩個無序列表是否相等?

如何在 C# 中有效比較兩個無序列表是否相等?

Susan Sarandon
發布: 2025-01-21 07:52:08
原創
688 人瀏覽過

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

比較無序List 物件的相等性

判斷兩個List 物件是否相等是常見問題。雖然它們可能包含相同的元素,但它們的順序可能不同。這就引出了一個問題:如何忽略元素順序來比較它們。

如果每個元素出現的次數很重要,一個簡單的解決方案是在比較之前對兩個列表進行排序:

<code class="language-csharp">Enumerable.SequenceEqual(list1.OrderBy(t => t), list2.OrderBy(t => t))</code>
登入後複製

針對IEquatable元素的最佳化方案

對於只需要實作IEquatable介面(而不是IComparable)的元素,有一個更有效的方法:

<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>
登入後複製

此方案計算第一個清單中每個元素出現的次數,然後從第二個清單中減去出現的次數。如果每個計數都達到零,則認為這兩個列表相等。

處理自訂鍵類型

如果元素類型無法比較(例如,可空型別),可以為字典指定比較器:

<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# 中有效比較兩個無序列表是否相等?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板