为了比较两个List<String>并提取他们的差异,我使用Linq的Except.
即:
假设我想使用Linq比较以下两个相等的列表:
List1 = "0,1,2,2,3"
List2 = "0,1,2,3"
List<string> differences1 = List1.Except(List2).ToList();
List<string> differences2 = List2.Except(List1).ToList();
differences1并且两个列表中differences2都没有项目2,但两个列表都不相等.我希望能够提取列表之间的所有差异,包括另一个没有的重复信息.
提取两个List<string>对象之间所有差异的最佳方法是什么?
所以你要找的是一个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;
    }
}