2009-08-26 7 views
14

要素の順序は気にしません。どちらが速いですか:連合または連合?

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

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

+11

List1.Concat(LIST2)と同じで両方の方法をお試し提供します。ストップウォッチを入手してください。それからあなたは知っているでしょう。 *推測*に基づいたパフォーマンス "分析"は、どのように教育されていても、エンジニアリング*の決定を下すための基礎としては実際には有用ではありません。 –

答えて

49

連合(EU)は、重複を削除します。 concatはありません。

ソースに共通の項目が含まれている場合や、内部の重複がある場合は、結果が異なります。

重複がないか、出力が少ない場合には、すでに得られた値に対して各値をテストする必要がないため、Concatは高速になります。

ただし、重複が多数あり、それらを必要としない場合、重複を削除するためのUnionの余分な処理は、結果を消費するコードの節約によって相殺される可能性があります。

9

実行速度のみを気にしますか?要素を受け取ったときに要素を処理するにはどのくらいの時間がかかりますか?

Concatは簡単です。処理自体を実行する必要はなく、すでに返されている結果をバッファする必要もありません。ただし、交差点に要素があれば、より多くの結果が得られます。各結果を処理するのに時間がかかる場合は、Concatとなり、実際にはが遅くなります。

+0

私の場合は、最後にDistinct()を使用します。これはUnionの使用を好むものです。 –

+6

Unionを使用する場合は、後でDistinctを呼び出す必要はありません。 –

+2

ユニオンはリスト間の重複を削除しますが、最初のリスト自体に重複がある場合、それらは共用体によって削除されません。だから状況に応じてDistinctを呼び出す必要があるかもしれません。 –

3

上記の内容は正しいです。あなたは、フルスピードが必要な場合は、例えば二つのリストとを連結する必要がある場合は、歩留まりを使用することを検討して

:ここには、いくつかの特別な場合ためのほんの少しの追加です。もちろん、これはフレキシブルで快適ではありません。UnionまたはConcat in Linq。したがって、特別な場合にのみ意味をなさない。例えば

このプロパティは、

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

      foreach (MyObject o2 in List2) 
       yield return o2; 
     } 
    } 
+0

'Concat'は例でそれを表示する方法です(see:[source](https://referencesource.microsoft.com/#System.Core/System/Linq/) Enumerable.cs#800))。したがって、あなた自身で実装する必要はありません。 – scher

関連する問題