c# - 有效地查找两个数组中重叠的值并将它们保存在第三个数组中

标签 c#

假设我有 2 个数组...

string[] a = {"a", "b", "c", "d", "e", "f", "h", "i", "j", "k"};
string[] b = {"a", "c", "d", "e", "g"};
string[] c;

我想创建一个结果数组 c,其中包含重叠值的列表。所以对于以上我会得到以下结果:

c = {"a", "c", "d", "e"};

我怎样才能有效地做到这一点?

最佳答案

最简单且高效的方法是使用 LINQ 的 Intersect 方法:

c = a.Intersect(b).ToArray();

这将使用 HashSet<T>在内部跟踪仍然可以返回的值。看我的Edulinq blog post on Intersect 了解更多详情。

请注意,结果实际上是一个集合 - 不能保证顺序(尽管在实践中它将是元素在 a 中出现的顺序)并且每个值只会出现 一次,即使它在两个原始数组中重复。

请注意,如果您只需要遍历结果,那么根本不将其转换为数组会更高效:

IEnumerable<string> intersection = a.Intersect(b);

编辑:要找到索引,您可以或者使用 LINQ 做一些小技巧,或者只是相当简单地迭代:

HashSet<string> remaining = new HashSet<string>(b);
List<Tuple<string, int>> pairs = new List<Tuple<string, int>>();
for (int i = 0; i < a.Length; i++)
{
    if (remaining.Remove(a[i]))
    {
        pairs.Add(Tuple.Of(a[i], i));
    }
}

关于c# - 有效地查找两个数组中重叠的值并将它们保存在第三个数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15165585/

相关文章:

c# - 获取 NameValueCollection 的所有值到一个字符串

c# - 对于以下情况,什么是好的设计模式?

c# - .NET IsValidXml 扩展方法性能

c# - Windows 窗体在显示消息前等待 5 秒

c# - 使用 Bloomberg API 时 session 未在 C# 中启动

c# - 处理网站和 cms 身份验证的用户身份

c# - 为什么我不能只使用 EventHandler<int> 而不是从 EventArgs 派生

c# - 为什么自定义 html 助手无法正确呈现标签

c# - 如何为 `PublishSingleFile` 和 macOS 使用 `dotnet` 选项?

c# - WCF post 方法实现