Sélectionner un élément par index à partir d’un hachage .NET

Pour le moment, j’utilise une classe personnalisée dérivée de HashSet . Il y a un point dans le code lorsque je sélectionne des articles sous certaines conditions:

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

Cela fonctionne bien et je reçois ces éléments. Mais y a-t-il moyen de recevoir un index de cet élément de la collection à utiliser avec la méthode ElementAt , au lieu d’objects entiers?

Cela ressemblerait plus ou moins à ceci:

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

Une itération manuelle sur toute la collection est-elle une meilleure solution? Je dois append que c’est dans une boucle plus grande, donc cette clause Where est exécutée plusieurs fois pour différentes chaînes someLabel .

modifier

Pour quoi ai-je besoin de ça? clusters est un ensemble de clusters d’une collection de documents. Les documents sont regroupés en groupes par similarité de sujets. Ainsi, l’une des dernières étapes de l’algorithme consiste à découvrir une étiquette pour chaque cluster. Mais l’algorithme n’est pas parfait et parfois il crée deux ou plusieurs grappes avec la même étiquette. Ce que je veux faire, c’est simplement fusionner ces grappes en une grosse.

Les ensembles n’ont généralement pas d’ index. Si la position est importante pour vous, vous devriez utiliser une List au lieu de (ou éventuellement aussi) d’un ensemble.

À présent, SortedSet dans .NET 4 est légèrement différent, en ce sens qu’il conserve un ordre de valeur sortingé. Cependant, il ElementAt toujours pas IList , l’access par index avec ElementAt va donc être lent.

Si vous pouviez donner plus de détails sur les raisons pour lesquelles vous voulez cette fonctionnalité, cela aiderait. Votre cas d’utilisation n’est pas vraiment clair pour le moment.

Si vous avez des éléments dans HashSet et que vous devez parfois obtenir des éléments par index, envisagez d’utiliser la méthode d’extension ToList () dans de telles situations. Vous utilisez donc les fonctionnalités de HashSet, puis vous tirez parti des index.

 HashSet hashset = new HashSet(); //the special situation where we need index way of getting elements List 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 

Il n’y a pas d’index avec un hash set. Une des manières dont les ensembles de hachage gagnent en efficacité dans certains cas est de ne pas avoir à les maintenir.

Je ne vois pas non plus quel est l’avantage ici. Si vous obteniez l’index et que vous l’utilisiez ensuite, ce serait moins efficace que de simplement obtenir l’élément (obtenir l’indice serait tout aussi efficace et vous auriez alors une opération supplémentaire).

Si vous souhaitez effectuer plusieurs opérations sur le même object, maintenez simplement cet object.

Si vous voulez faire quelque chose sur plusieurs objects, faites-le en itérant (normal pour foreach ou pour foreach résultat sur les résultats d’un Where() etc.). Si vous voulez faire quelque chose sur plusieurs objects, puis faire autre chose sur ces mêmes objects et que vous devez le faire dans de tels lots, plutôt que de faire toutes les opérations dans le même foreach puis enregistrez les résultats de Where() dans une List .