Найти совпадения объектов из массивов - PullRequest
2 голосов
/ 04 августа 2010

Допустим, у меня есть 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 Ответ

6 голосов
/ 04 августа 2010

Как насчет:

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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...