19

現在、から派生したカスタムクラスを使用してい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つ以上のクラスターを作成する場合があります。私がやりたいのは、それらのクラスターを大きなクラスターにマージすることです。

4

3 に答える 3

28

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

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

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

于 2010-09-30T08:33:29.730 に答える
9

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 
于 2013-05-23T20:07:04.157 に答える
3

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

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

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

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

于 2010-09-30T09:08:48.557 に答える