2012-05-09 11 views
0

ポイントを追加するために使用しているポイントのリストがあります。リストに要素を追加するより良い方法C#

私には2つのアプローチがありますが、どれが良いかを知りたいだけです。 Iポイント4倍を追加する必要が

borderPoints.Add(p1); 
borderPoints.Add(p2); 

、私に近づくた:私は以下のようにポイントを追加する第二のアプローチで

List<Point> borderPoints = new List<Point>(); 

       Point p1 = new Point(0, 0); 
       Point p2 = new Point(Width, 0); 

       borderPoints.AddRange(new[] { p1, p2 }); 

は、次の最初のアプローチのためのコードでありますなぜそれは重要なのでしょうか?

+0

あなたはあまりにもポイントを追加する必要がある場合** 4回**本当に議論することも本当にありません。覚えておいてください - 早すぎる最適化はすべての悪の根源です。 何千ものポイントを追加する必要がある場合は、Tigranの答えをお読みください。 –

+0

パフォーマンスに大きな影響を与えるとは思いません。それは主にスタイルの決定 - IMHOです。あなたがリストのサイズを知っているときはいつでも、その値を提供してより効率的に割り当てることができます。 AddRangeはもっと複雑です - Addはもっとパフォーマンスが良いかもしれません(http://stackoverflow.com/questions/2123161/listt-addrange-implementation-suboptimal) –

答えて

1

あなたが正しいです:

+0

しかし、リストに項目を追加する必要があるときや、いくつかの余分な操作が舞台裏で実行されているとき(例えば、サイズを変更し無効にするコンテナにコントロールを追加する)、Addメソッドの乗算時間は暗黙の操作の多重呼び出しになります。 AddRangeを呼び出すと余分な操作が1回呼び出されます(ほとんどの場合、AddRangeがうまく設計されていると仮定します)。 – adams

2

間違いなく最初のものを選択してください。 AddRangeは、すべての単一のAddよりもはるかに高速に動作します。

List<Point> borderPoints = new List<Point>(new Point[] { 
    new Point(0, 0), 
    new Point(Width, 0), 
}); 
+0

AddRangeがもっと速く働くという事実をいくつか見せていただけますか? – Reniuz

+0

@ Reenuuz:ここをクリックしてください:[Add vs Addrange](http://geekswithblogs.net/sdorman/archive/2007/09/21/Add-vs.-AddRange.aspx) – Tigran

+0

@Reniuz:すべての要素に追加するリストを追加する必要があるかどうかを確認する必要があるかどうかを確認する必要があります。1000の場合は1000回、1000の要素の場合は1つのみです。パフォーマンスのメリットをクリア – Tigran

2

は、第三のアプローチを使用します(リストのコレクションの成長によるリストRSIZEを考えるならば、それが明確になります)。 あなたの状況では、あなたのプログラミングスタイルのより多くの場合です。

Add()は、簡潔で便利なサイクルですが、 AddRange()は一度に使用した方がよりエレガントに見えます。

パフォーマンスを考える:Add()コレクション(MSDNのドキュメント)に新しいツリーノードを追加しながら

AddRange()はコレクションに以前に作成したツリーノードの配列を追加します。

ノード数をわずかに増やしたり、頻繁にノードを追加しない場合は、Add()を使用してください。

+0

**新しいリストを** **初期化する場合は、この要素を追加したい場合はこのチェックを入れてください。 – Tigran

+0

私は時にはこれも使用します。 – lionheart

+0

@Tigran:Trueですが、Praveenは要素を追加する前にListが初期化されていることを示しています。 – Eric

0

1)リストに追加するポイント数を事前に把握している場合は、リストコンストラクタを「容量」パラメータとともに使用します。

2)何度も使用しない限り、新しい配列をインスタンス化するだけで、AddRangeにポイントを渡すことは無駄です。

0

範囲がAddRangeの場合は答えが簡単で、1つの項目がある場合はAddを使用してください。

あなたの場合、私はリストを一切使用しません。私にとっては、BorderPointsというコンセプトが欠けているようです。このようなもの:

public class BorderPoints { 
    public BorderPoints(Point p1, Point p2) { 
     _p1 = p1; 
     _p2 = p2; 
    } 
} 

Then you can just use that instead of the list. 
0

私は第2のアプローチを使用します。

最初のアプローチは、不必要に配列をインスタンス化するため、非常にわずかに遅くなります。

追加する項目が既にコレクション(または列挙)内にある場合は、AddRangeのみを使用してください。

var list = new List<T>(capacity); 
... add items ... 

か:一般的に

、あなたはパフォーマンスのすべての最後のナノ秒を圧迫したい場合、あなたはあなたのリストの容量を確保して行うことができますが、追加しようとしているすべての項目のための十分な大きさであります

個々の項目を配列にコピーしてからリストに追加すると、何も得られません。

関連する問題