Что быстрее: Union или Concat? - PullRequest
       15

Что быстрее: Union или Concat?

15 голосов

Ответы [ 3 ]

51 голосов
/ 27 августа 2009

Союз удаляет дубликаты. Конкат не делает.

Таким образом, они дают разные результаты, если источники либо содержат какие-либо общие элементы, либо имеют какие-либо внутренние дубликаты.

Если вы можете гарантировать, что дубликатов нет, или если их мало и вас не волнует наличие их в выводе, Concat будет работать быстрее, поскольку нет необходимости проверять каждое значение на соответствие уже полученному. 1005 *

Однако, если дубликатов много и они вам не нужны, дополнительная обработка в Union для удаления дубликатов может быть компенсирована экономией в вашем коде, который потребляет результаты.

10 голосов
/ 27 августа 2009

Вас интересует только скорость выполнения? Сколько времени занимает обработка элемента при его получении?

Concat проще - ему не нужно выполнять какую-либо обработку самостоятельно или буферизовать результаты, которые уже возвращены. Однако, это даст больше результатов, если на пересечении будут какие-либо элементы. Если вам потребуется много времени для обработки каждого результата, Concat может в итоге эффективно быть медленнее.

3 голосов
/ 21 июля 2014

То, что было сказано выше, верно. Вот лишь небольшое дополнение для некоторых особых случаев :

Если вам нужно объединить, например, два списка и , если вам нужна полная скорость, рассмотрите возможность использования yield . Конечно, это намного менее гибко и удобно, чем Union или Concat в Linq. Поэтому это имеет смысл только в особых случаях.

Это свойство, например, будет предоставлять то же самое, что List1.Concat (List2)

    public IEnumerable<MyObject> AllObjects
    {
        get
        {
            foreach (MyObject o1 in List1)
                yield return o1;

            foreach (MyObject o2 in List2)
                yield return o2;
        }
    }
...