有效地找到两个数组中重叠的值,并将它们保存在第三个数组中

本文关键字:数组 保存 存在 三个 两个 重叠 有效地 | 更新日期: 2023-09-27 18:01:59

假设我有两个数组…

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>来跟踪仍然可以返回的值。关于Intersect的更多细节,请参阅我的Edulinq博客文章。

注意,结果实际上是一个集合—顺序不能保证(尽管在实践中它将是元素在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));
    }
}

Linq中的Intersect方法可以满足您的需求。

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