4 回答

TA貢獻1836條經驗 獲得超3個贊
已編輯
除了會工作得更快。在這里您可以了解它的性能
var missedOld = oldList.Except(newList, new ItemsEqualityComparer());
var oldList= oldList.Except(missedOld, new ItemsEqualityComparer());
舊答案
缺少項目的兩個不同列表
var missedOld = oldList.Where(x => !newList.Select(i => i.ItemID).Contains(x.ItemID))
var missedNew = newList.Where(x => !oldList.Select(i => i.ItemID).Contains(x.ItemID))
一個列表中的所有錯過的項目:
oldList.Concat(newList).GroupBy(x => x.ItemID).Where(x => x.Count() < 2).Select(x => x.Value).ToList()

TA貢獻1786條經驗 獲得超11個贊
var items = new List<int>(oldList.Select(x => x.ItemID )); var missingValues = newList.Where(x => !diffids.Contains(x.ItemID)).ToList();
您也可以使用除。

TA貢獻1785條經驗 獲得超4個贊
如果列表足夠大以至于嵌套循環需要 30 秒,我建議您將每個列表的項目放入相應的 HashSet 并使用它來查找異常。哈希表將以 O(1) 或 O(log N) 縮放,而比較 2 個未排序的列表是 O(n^2)。
也就是說,嘗試使用 Linq except()
var notinNewList = oldList.Except(newList);
如果我沒記錯的話,.Except() 的內部實現依賴于 HashSets
其次,如果列表已排序,或者可以預先排序,那么您可以在沒有嵌套循環的情況下一次性進行線性傳遞,這可能比任何方法都快。
我不建議使用 List.Contains() 因為它是一個線性實現,這將導致您試圖避免的 O(n^2) 相同,盡管由于 Linq 語法糖它看起來更漂亮。
- 4 回答
- 0 關注
- 173 瀏覽
添加回答
舉報