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 关注
- 128 浏览
添加回答
举报