使用Linq </string>将List <string>与重复信息进行比较

时间:2013-12-17 15:17:10

标签: c# linq list

要比较两个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();

differences1differences2两个列表中都没有2项,但两个列表都 NOT 相等。我希望能够提取列表之间的所有差异,包括另一个没有的重复信息。

提取两个List<string>对象之间所有差异的最佳方法是什么?

5 个答案:

答案 0 :(得分:5)

所以你要找的是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;
    }
}

答案 1 :(得分:0)

您可以按键分组,然后使用Except()

比较组

看起来像这样(未经过测试可能会有拼写错误):

var groupList1 = List1.GroupBy(x => x).ToList();
var groupList2 = List2.GroupBy(x => x).ToList();

var differences1 = groupList1.Except(groupList2).ToList();
var differences2 = groupList2.Except(groupList1).ToList();

答案 2 :(得分:0)

在比较之前,您可以在列表上调用.Distinct()

List<string> differences1 = List1.Distinct().Except(List2).ToList();
List<string> differences2 = List2.Distinct().Except(List1).ToList();

答案 3 :(得分:0)

您可以使用Distinct消除重复项,然后进行比较。

var distinctList1 = List1.Distinct().ToList();
var distinctList2 = List2.Distinct().ToList();

var differences1 = distinctList1.Except(distinctList2).ToList();
var differences2 = distinctList2.Except(distinctList1).ToList();

答案 4 :(得分:0)

您可以创建列表的副本,然后删除另一个中存在的所有内容:

var diff1 = list1.ToList();
var diff2 = list2.ToList();
diff1.RemoveAll(diff2.Remove);
相关问题