3 回答

TA貢獻(xiàn)1785條經(jīng)驗 獲得超4個贊
用途Except:
var firstNotSecond = list1.Except(list2).ToList();
var secondNotFirst = list2.Except(list1).ToList();
我懷疑有這實際上是略高于這個速度的方法,但即使這樣會大大超過你的O(N * M)的方法要快。
如果要組合使用這些方法,可以使用上面的方法創(chuàng)建一個方法,然后再使用return語句:
return !firstNotSecond.Any() && !secondNotFirst.Any();
要注意的一點(diǎn)是,有是在問題的原代碼和這里的解決方案之間的結(jié)果有所不同:任何重復(fù)的元素,其僅在一個列表將只與我的代碼報告一次,而他們會被報告為多原始代碼中出現(xiàn)的次數(shù)。
例如,清單[1, 2, 2, 2, 3]和[1],在“列表1中的元素,但不是列表2”導(dǎo)致原始代碼將是[2, 2, 2, 3]。用我的代碼就可以了[2, 3]。在許多情況下,這不是問題,但是值得一提。

TA貢獻(xiàn)1877條經(jīng)驗 獲得超6個贊
更有效的方法是使用Enumerable.Except:
var inListButNotInList2 = list.Except(list2);
var inList2ButNotInList = list2.Except(list);
通過使用延遲執(zhí)行來實現(xiàn)此方法。這意味著您可以編寫例如:
var first10 = inListButNotInList2.Take(10);
由于它內(nèi)部使用a Set<T>比較對象,因此它也是有效的。它的工作方式是首先從第二個序列中收集所有不同的值,然后流式傳輸?shù)谝粋€序列的結(jié)果,并檢查它們以前沒有被看到過。
- 3 回答
- 0 關(guān)注
- 632 瀏覽
添加回答
舉報