3

假设我有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"};

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

4

2 回答 2

8

最简单的方法——也是有效的——是使用 LINQ 的Intersect方法:

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

这将在HashSet<T>内部使用 a 来跟踪仍然可以返回的值。有关更多详细信息,请参阅我的Edulinq 博客文章。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));
    }
}
于 2013-03-01T19:45:15.373 回答
2

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

 c = a.Intersect(b).ToArray();
于 2013-03-01T19:45:17.140 回答