所以基本上我有两个大列表,如下所示:
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”...
已编辑
除了工作速度会快得多。在这里您可以了解它的性能
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)