例如,我有两个数组:
string[] arrayOne = {"One", "Two", "Three", "Three", "Three"};
string[] arrayTwo = {"One", "Two", "Three"};
var result = arrayOne.Except(arrayTwo);
foreach (string s in result) Console.WriteLine(s);
我想要 arrayOne
中的项目,而 arrayTwo
中没有。所以在这里我需要的结果是:Three Three
但我没有得到任何结果,因为它将“三”视为常见的并且不检查其他两项(“三”,“三”)。
我不想写一个庞大的方法来解决这个问题。在 SO 上尝试了几个其他答案,但没有按预期工作:(。
谢谢!!!
最佳答案
构建第二个的 HashSet,然后过滤第一个只允许的项目,如果你不能从 HashSet 中删除该项目。
var hs = new HashSet<string>(arrayTwo);
var filtered = arrayOne.Where(item => !hs.Remove(item)).ToArray();
罢工><罢工>罢工>
考虑到您在评论中的额外要求,巧妙地使用 ILookup
在这里工作得很好。
var lookup1 = arrayOne.ToLookup(item => item);
var lookup2 = arrayTwo.ToLookup(item => item);
var output = lookup1.SelectMany(i => i.Take(i.Count() - lookup2[i.Key].Count())).ToArray();
关于c# - 使用 LINQ 比较两个数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33812323/