c# - 使用 LINQ 比较两个数组

标签 c# .net arrays linq compare

例如,我有两个数组:

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/

相关文章:

c# - Environment.GetFolderPath(...CommonApplicationData) 在 XP 和 Server 2003 上返回空字符串

c# - 继承方案

c# - 追加没有硬编码值的字符串

ios - 如何改变UICollectionView的填充方向?

c - 如何初始化函数指针数组?

c# - 使用带有 MVC4 的高级集线器 api 的 SignalR 错误 - "/echo/negotiate 404 Not Found Error"

c# - Azure Function HttpClient 不给出任何响应并不断重试

c# - 系统.Runtime.Serialization.SerializationException : Unable to find assembly MyAssembly

c# - C# 中线程仍在运行

java - 我应该选择什么数组来插入这个json对象?