LINQ获得两个列表的差异 - >保留重复

时间:2014-03-11 12:45:40

标签: linq

假设有两个列表A和B

Dim A as New List(Of String) ( {"011", "011", "012", "001"})
Dim B as New List(Of String) ( {"011", "012", "111"});

我想从A到B得到区别,在这个例子中:[ "011", "001" ]

列表A和B都可能包含重复的条目。 IF列表A包含重复元素 e ,列表B的值 e 的值只比//少一倍,而结果列表应包含(times e in A) - (times e in B) ë

例如:

["001", "001", "001", "002"] ~ ["001", "001", "003" ] -> ["001", "002"]

这个问题的解决方案在经典的编程方式中是微不足道的,但我希望有一个(更短的)LINQ解决方案,但到目前为止,我找不到一段有效的代码,因为Intersect, Except and Union全部被切掉了我需要保留的副本。

我很高兴看到一个简单的LINQ解决方案

2 个答案:

答案 0 :(得分:6)

var tmp = b.ToList();
var result = a.Where(s => !tmp.Remove(s)).ToList();

答案 1 :(得分:1)

干净地使用ToLookup的替代方案可能是值得的 - 特别是如果列表变大。

这是:

Dim AL = A.ToLookup(Function (x) x)
Dim BL = B.ToLookup(Function (x) x)

Dim C = _
    AL _
        .SelectMany(Function (xs) xs.Skip(BL(xs.Key).Count())) _
        .ToList()

或者,在c#中:

var AL = A.ToLookup(x => x);
var BL = B.ToLookup(x => x);

var C =
    AL
        .SelectMany(xs => xs.Skip(BL[xs.Key].Count()))
        .ToList();