亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

C# / .NET 比較兩個大列表并從兩個列表中查找缺失的項目

C# / .NET 比較兩個大列表并從兩個列表中查找缺失的項目

C#
一只名叫tom的貓 2022-10-23 10:11:44
所以基本上我有兩個大列表,如下所示:public class Items{ public string ItemID { get; set; }}var oldList = new List<Items>(); // oldListvar newList = new List<Items>(); // new list兩個列表都非常大,如果它們都很大(超過 30 秒),由于執行時間很短,因此簡單的雙 foreach 是不夠的。在我在 stackoverflow 上提出的上一個問題中,我得到了關于如何比較這兩個相同列表并找出哪些項目具有不同 QuantitySold 參數的回復,然后將其存儲在名為“DifferentQuantityItems”的第三個列表中,如下所示:var differentQuantityItems =    (from newItem in newList     join oldItem in oldList on newItem.ItemID equals oldItem.ItemID     where newItem.QuantitySold != oldItem.QuantitySold     select newItem).ToList();現在我想從這兩個列表中得到以下信息:- A list of items that are present in newList, but not in oldList- A list of items that are present in oldList, but not in newList我怎樣才能做到這一點?有人可以幫我嗎?PS我會“知道”其中一個列表中缺少任一項目的方式是通過屬性“ItemID”......
查看完整描述

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



查看完整回答
反對 回復 2022-10-23
?
守著星空守著你

TA貢獻1799條經驗 獲得超8個贊

您是否考慮過將列表轉換為哈希集并使用 except 方法?

請參閱兩個列表之間的差異

并且:有沒有辦法在c#中獲得兩組對象之間的差異


查看完整回答
反對 回復 2022-10-23
?
Qyouu

TA貢獻1786條經驗 獲得超11個贊

var items = new List<int>(oldList.Select(x => x.ItemID ));
var missingValues = newList.Where(x => !diffids.Contains(x.ItemID)).ToList();

您也可以使用除。


查看完整回答
反對 回復 2022-10-23
?
九州編程

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 語法糖它看起來更漂亮。


查看完整回答
反對 回復 2022-10-23
  • 4 回答
  • 0 關注
  • 173 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號