2009-08-26 2 views
14

Меня не волнует порядок элементов.Который быстрее: Союз или Конкат?

http://msdn.microsoft.com/en-us/library/system.linq.enumerable.union.aspx

http://msdn.microsoft.com/en-us/library/bb302894.aspx

+11

Попробуйте оба способа. Выйдите из секундомера. Тогда вы узнаете. Эффективный «анализ» на основе «догадок», независимо от того, насколько он образован, на самом деле не полезен в качестве основы для принятия * инженерных решений. –

ответ

49

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

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

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

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

9

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

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

+0

В моем случае, я использую Distinct() в конце, что благоприятствует использованию Союза, я думаю. –

+6

Если вы используете Union, тогда вам не нужно вызывать Distinct в любом случае. –

+2

Союз удаляет дубликаты между списками, но если в первом списке есть дубликаты внутри себя, они не будут удалены объединением. Так что, в зависимости от обстоятельств, все равно нужно будет вызывать различие. –

3

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

Если вы должны сцепить, например два списка и , если вам нужна полная скорость, рекомендуется использовать выход. Конечно, это намного менее гибкий и удобный, чем Союз или 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; 
     } 
    } 
+0

'Concat' точно делает это так, как вы показываете его в примере (см. [источник] (https://referencesource.microsoft.com/#System.Core/System/Linq/ Enumerable.cs # 800)). Поэтому нет необходимости реализовывать его самостоятельно. – scher

Смежные вопросы