假设我有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"};
我怎样才能有效地做到这一点?
答案 0 :(得分:8)
最简单的方法 - 也是有效的 - 是使用LINQ的Intersect
方法:
c = a.Intersect(b).ToArray();
这将在内部使用HashSet<T>
来跟踪仍可返回的值。有关详细信息,请参阅我的Edulinq blog post on Intersect
。
请注意,结果实际上是 set - 订单无法保证(尽管实际上它将是元素在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));
}
}
答案 1 :(得分:2)
Linq中的Intersect
方法可以满足您的需求。
c = a.Intersect(b).ToArray();