假设我有4个数组:
[1,3,54,4]
[54,2,3,9]
[3,2,9,54]
[54,8,4,3]
我需要获取所有数组中存在的(通用)对象(在本例中为整数,但它们将是自定义对象)。在上面的例子中,我需要的结果是:[54,3]因为这是所有四个数组中唯一的两个项目。 顺序无关紧要,速度很重要,数组大小和数组的数量会有很大差异。 我正在使用C#4和ASP.NET。数组将是List,尽管它们可以被转换。
谢谢:)
答案 0 :(得分:6)
怎么样:
ISet<int> intersection = new HashSet<int>(firstArray);
intersection.IntersectWith(secondArray);
intersection.IntersectWith(thirdArray);
intersection.IntersectWith(fourthArray);
请注意,这应该比更明显的效率更高:
var x = firstArray.Intersect(secondArray)
.Intersect(thirdArray)
.Intersect(fourthArray);
因为后者将为每个方法调用创建一个新的哈希集。
显然,你需要循环使用多个数组,例如
static ISet<T> IntersectAll<T>(IEnumerable<IEnumerable<T>> collections)
{
using (IEnumerator<T> iterator = collections.GetEnumerator())
{
if (!iterator.MoveNext())
{
return new HashSet<T>();
}
HashSet<T> items = new HashSet<T>(iterator.Current);
while (iterator.MoveNext())
{
items.IntersectWith(iterator.Current);
}
return items;
}
}