为了比较两个List
并提取他们的差异,我使用Linq的Except
.
即:
假设我想使用Linq比较以下两个相等的列表:
List1 = "0,1,2,2,3" List2 = "0,1,2,3" Listdifferences1 = List1.Except(List2).ToList(); List differences2 = List2.Except(List1).ToList();
differences1
并且两个列表中differences2
都没有项目2
,但两个列表都不相等.我希望能够提取列表之间的所有差异,包括另一个没有的重复信息.
提取两个List
对象之间所有差异的最佳方法是什么?
所以你要找的是一个Except
适用于包包,而不是套装.因此,如果一个序列有一个项目的2个副本并且您用一个副本减去一个集合,则应该剩下一个副本,而不是在执行减法之前将所有序列减少为不同的集合,如同Except
.
这使得处理起来稍微不那么优雅,但它仍然不是很糟糕.HashSet
您只需要将项目映射到副本的数量,而不是在另一个集合中表示项目.然后对于每个项目,如果它在字典中,从计数中删除一个并且不产生它,如果它不在字典中那么它应该被产生.
public static IEnumerable<T> BagDifference<T>(IEnumerable<T> first , IEnumerable<T> second) { var dictionary = second.GroupBy(x => x) .ToDictionary(group => group.Key, group => group.Count()); foreach (var item in first) { int count; if (dictionary.TryGetValue(item, out count)) { if (count - 1 == 0) dictionary.Remove(item); else dictionary[item] = count - 1; } else yield return item; } }