C#/.NET 比较两个大列表并从两个列表中查找丢失的项目

Use*_*987 5 c# linq

所以基本上我有两个大列表,如下所示:

public class Items
{
 public string ItemID { get; set; }
}


var oldList = new List<Items>(); // oldList

var newList = new List<Items>(); // new list
Run Code Online (Sandbox Code Playgroud)

两个列表都非常大,如果它们都很大(超过 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();
Run Code Online (Sandbox Code Playgroud)

现在我想从这两个列表中得到以下内容:

- 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
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?有人可以帮我吗?

PS我“知道”其中一个列表中缺少任何一项的方式是通过属性“ItemID”...

Akm*_*hov 4

已编辑

除了工作速度会快得多。在这里您可以了解它的性能

var missedOld = oldList.Except(newList, new ItemsEqualityComparer());
var oldList= oldList.Except(missedOld, new ItemsEqualityComparer());
Run Code Online (Sandbox Code Playgroud)

旧答案

两个不同的列表缺少项目

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))
Run Code Online (Sandbox Code Playgroud)

所有错过的项目都在一个列表中:

oldList.Concat(newList).GroupBy(x => x.ItemID).Where(x => x.Count() < 2).Select(x => x.Value).ToList()
Run Code Online (Sandbox Code Playgroud)