web-dev-qa-db-ja.com

.NETHashSetからインデックスで要素を選択します

現在、私はHashSetから派生したカスタムクラスを使用しています。特定の条件下でアイテムを選択すると、コードにポイントがあります。

var c = clusters.Where(x => x.Label != null && x.Label.Equals(someLabel));

それはうまく機能し、私はそれらの要素を取得します。しかし、オブジェクト全体ではなく、コレクション内のその要素のインデックスを受け取って、ElementAtメソッドで使用する方法はありますか?

それは多かれ少なかれこのように見えるでしょう:

var c = select element index in collection under certain condition;
int index = c.ElementAt(0); //get first index
clusters.ElementAt(index).RunObjectMthod();

コレクション全体を手動で繰り返す方が良い方法ですか?より大きなループにあることを追加する必要があるため、このWhere句はさまざまなsomeLabel文字列に対して複数回実行されます。

編集

これは何のために必要ですか? clustersは、いくつかのドキュメントコレクションのクラスターのセットです。ドキュメントは、トピックの類似性によってクラスターにグループ化されます。したがって、アルゴリズムの最後のステップの1つは、各クラスターのラベルを検出することです。ただし、アルゴリズムは完全ではなく、同じラベルを持つ2つ以上のクラスターを作成する場合があります。私がやりたいのは、単にそれらのクラスターを大きなクラスターにマージすることです。

15
Ventus

セットには通常インデックスはありません。位置が重要な場合は、セットの代わりに(または、場合によっては同様に)List<T>を使用する必要があります。

.NET 4の SortedSet<T> は、ソートされた値の順序を維持するという点で少し異なります。ただし、それでもIList<T>は実装されていないため、ElementAtを使用したインデックスによるアクセスは遅くなります。

この機能が必要な理由について詳しく説明していただければ、役に立ちます。現時点では、ユースケースは明確ではありません。

23
Jon Skeet

HashSetに要素を保持していて、インデックスで要素を取得する必要がある場合は、そのような状況で拡張メソッドToList()の使用を検討してください。したがって、HashSetの機能を使用してから、インデックスを利用します。

HashSet<T> hashset = new HashSet<T>();

//the special situation where we need index way of getting elements
List<T> list = hashset.ToList();

//doing our special job, for example mapping the elements to EF entities collection (that was my case)

//we can still operate on hashset for example when we still want to keep uniqueness through the elements 
8
Bronek

ハッシュセットのあるインデックスのようなものはありません。ハッシュセットが効率を上げる方法の1つは、ハッシュセットを維持する必要がないことです。

また、ここでの利点がわかりません。インデックスを取得して使用する場合、これは要素を取得するよりも効率が低くなります(インデックスを取得することも同様に効率的であり、追加の操作が必要になります)。

同じオブジェクトに対して複数の操作を実行する場合は、そのオブジェクトを保持するだけです。

複数のオブジェクトに対して何かを実行したい場合は、それらを反復処理することに基づいて実行します(通常のforeachまたはWhere()の結果に対してforeachを実行します)。 。複数のオブジェクトに対して何かを実行し、次にそれらのいくつかの同じオブジェクトに対して何かを実行する必要があり、すべての操作を同じforeachで実行するのではなく、そのようなバッチで実行する必要がある場合は、結果を保存します。 _List<T>_のWhere()の。

3
Jon Hanna