第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

比較兩個List<T>對象是否相等,忽略順序

比較兩個List<T>對象是否相等,忽略順序

白衣染霜花 2019-07-19 18:42:27
比較兩個List<T>對象是否相等,忽略順序還有一個清單-比較問題。List<MyType> list1;List<MyType> list2;我需要檢查它們是否具有相同的元素,而不管它們在列表中的位置如何。各MyType對象可能多次出現(xiàn)在列表中。有沒有一個內(nèi)置的函數(shù)來檢查這個?如果我保證每個元素只在一個列表中出現(xiàn)一次呢?
查看完整描述

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);
??...


查看完整回答
反對 回復 2019-07-19
?
肥皂起泡泡

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();

使用SET操作(IntersectUnionExcept)比使用以下方法更有效Contains..在我看來,它也更好地表達了您的查詢的期望。

編輯:既然你已經(jīng)澄清了你的問題,我可以說你想用第一種形式-因為重復很重要。下面是一個簡單的示例,說明您得到了所需的結(jié)果:

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();


查看完整回答
反對 回復 2019-07-19
?
森欄

TA貢獻1810條經(jīng)驗 獲得超5個贊

如果你不關(guān)心發(fā)生的次數(shù),我會這樣對待它。與簡單的迭代相比,使用散列集將提供更好的性能。

var set1 = new HashSet<MyType>(list1);var set2 = new HashSet<MyType>(list2);return set1.SetEquals(set2);

這將要求您已重寫.GetHashCode()并付諸實施IEquatable<MyType>在……上面MyType.


查看完整回答
反對 回復 2019-07-19
  • 3 回答
  • 0 關(guān)注
  • 1725 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號