首頁 > 後端開發 > C++ > 如何有效比較兩個列表的相等性、忽略順序並允許重複?

如何有效比較兩個列表的相等性、忽略順序並允許重複?

DDD
發布: 2025-01-21 07:37:10
原創
181 人瀏覽過

How Can I Efficiently Compare Two Lists for Equality, Ignoring Order and Allowing Duplicates?

比較List物件是否相等

本文探討如何比較兩個List物件是否包含相同的元素,而不考慮元素的順序。值得注意的是,MyType類型的物件在任一清單中都可能出現多次。

初始方案

為了確保精確的相等性,即兩個列表包含相同的元素及其頻率,建議在比較之前對列表進行排序:

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

最佳化方案

然而,為了提高性能,有人提出了另一個方案:

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

這種方法的性能明顯優於初始方案,只需要IEquatable接口,而不需要IComparable接口。

處理各種資料型別

為了適應包含不同資料型態(包括可空型別)作為鍵的情況,可以使用改良後的方案:

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

以上是如何有效比較兩個列表的相等性、忽略順序並允許重複?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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