假设有两个列表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解决方案
答案 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();