Ответ 1

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

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

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

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

Ответ 2

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

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

Ответ 3

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

Если вам нужно объединить, например, два списка и , если вам нужна полная скорость, рассмотрите возможность использования 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;
        }
    }