2012-10-17 4 views
5

List<T>に要素を追加し、インデックスをintに戻す関数がありますか? List<T>.Add()voidであり、値は戻されません。List <T>に要素を追加してインデックスを取得するにはどうすればいいですか?

List.Count-1は、スレッドで作業していない場合の解決策です。私のリストは静的メンバであり、一度に複数のスレッドでアクセスすることができ、count-1の値を使用するとスレッドが完全に安全でなくなり、間違った結果につながりやすくなります。

インデックスは、各要素の特定の処理に使用されます。

ありがとうございました!

+2

質問は、 'List.Add'スレッドセーフですか? –

+2

代わりにコンカレントコレクションの1つを使用する必要がありますか? – CookieOfFortune

答えて

10

リストのメソッドはスレッドセーフではありません。繰り返し複数のスレッドからList.Addを呼び出すと、問題が発生する可能性があります。最初にListを使用する場合は、何らかの同期技術を使用する必要があります。したがって、その重要なセクションの内部にList.Countへの呼び出しを含めることもできます。

その他のオプションは、System.Collections.Concurrentのような複数のスレッドで使用するように設計されたコレクションを使用することです。

+2

+1 - しかし 'System.Collections.Concurrent'は.NET 4.0 – keyboardP

+0

@keyboardPうん、私はそれを一つの選択肢として挙げたのです。 – Servy

+0

さて、.Net 4.0へのアップグレードは簡単ではありません。しかし解決策は受け入れられる価値がある –

0

スレッドセーフなインデックスが必要な場合は、インデックスを持っていてもアイテムを削除したりリストを変更したりする可能性があるため、ロックが必要です。あなたはそれを呼び出すことができるように値のインデックスを返した

、あなたがlist.IndexOf(値)を試みることができる、私はリストのindexOf()メソッドを持っていると信じている

-2

(すべての要素が一意であると仮定した場合)リストの要素を次のようにリストに追加した後:

list.add(element); 
int index = list.indexOf(element); 
+3

アイテムがリストに複数回含まれていないと仮定します。 – Servy

+1

indexOf()の大きなOは、O(N)です。 – CookieOfFortune

+1

あなたの要素がコレクションである場合、そのようなメソッド(コレクションのサイズに関して)を使用するのは賢明ではありません。特に、スレッドを使用する場合は特にです。 –

関連する問題