3 回答

TA貢獻1777條經(jīng)驗 獲得超3個贊
如果您希望它們是真正相等的(即相同的項和每個項的數(shù)目),我認為最簡單的解決方案是在比較之前進行排序:
Enumerable.SequenceEqual(list1.OrderBy(t?=>?t),?list2.OrderBy(t?=>?t))
編輯:
下面是一個性能更好的解決方案(大約快10倍),并且只需要IEquatable
,不是IComparable
:
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);}
編輯2:
若要將任何數(shù)據(jù)類型作為鍵(例如,正如Frank Tzanabetis指出的可空類型)處理,您可以創(chuàng)建一個采用比較器詞典:
public?static?bool?ScrambledEquals<T>(IEnumerable<T>?list1,?IEnumerable<T>?list2,?IEqualityComparer<T>?comparer)?{ ??var?cnt?=?new?Dictionary<T,?int>(comparer); ??...

TA貢獻1829條經(jīng)驗 獲得超6個贊
..無論它們在列表中的位置如何,它們都有相同的元素。每個MyType對象可能在列表中出現(xiàn)多次。
// lists should have same count of items, and set difference must be emptyvar areEquivalent = (list1.Count == list2.Count) && !list1.Except(list2).Any();
// check that [(A-B) Union (B-A)] is emptyvar areEquivalent = !list1.Except(list2).Union( list2.Except(list1) ).Any();
Intersect
, Union
, Except
Contains
編輯:
var a = new[] {1, 2, 3, 4, 4, 3, 1, 1, 2};var b = new[] { 4, 3, 2, 3, 1, 1, 1, 4, 2 };// result below should be true, since the two sets are equivalent...var areEquivalent = (a.Count() == b.Count()) && !a.Except(b).Any();

TA貢獻1810條經(jīng)驗 獲得超5個贊
var set1 = new HashSet<MyType>(list1);var set2 = new HashSet<MyType>(list2);return set1.SetEquals(set2);
.GetHashCode()
IEquatable<MyType>
MyType
.
- 3 回答
- 0 關(guān)注
- 1725 瀏覽
添加回答
舉報