从数组中查找对象匹配项

时间:2010-08-04 13:14:58

标签: arrays c#-4.0

假设我有4个数组:

[1,3,54,4]
[54,2,3,9]
[3,2,9,54]
[54,8,4,3]

我需要获取所有数组中存在的(通用)对象(在本例中为整数,但它们将是自定义对象)。在上面的例子中,我需要的结果是:[54,3]因为这是所有四个数组中唯一的两个项目。 顺序无关紧要,速度很重要,数组大小和数组的数量会有很大差异。 我正在使用C#4和ASP.NET。数组将是List,尽管它们可以被转换。

谢谢:)

1 个答案:

答案 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;
    }
}