Pour accéder à l'élément à l'index spécifié dans un "SortedSet'
Comment puis-je accéder à l'élément à l'index spécifié (position) dans une SortedSet
?
Contrairement à SortedList
, SortedSet
n'offre pas une Item
de la propriété.
(Aussi, contrairement à SortedList
, SortedSet
applique à chacun de ses membres d'être unique. C'est, d'une SortedSet
est garanti pas à contenir des doublons.)
- Voici une demande de fonctionnalité pour Microsoft github.com/dotnet/corefx/issues/4695
Vous devez vous connecter pour publier un commentaire.
C'est parce que
SortedSet
a la sémantique d'un ensemble et n'est pas unList
construire. Par conséquent, il ne permet pas de mettre en œuvreIList
(qui vous donnent la possibilité d'aborder les éléments par index via leItem
propriété).Comme le fait remarquer @DavidRR, vous pouvez utiliser l'extension Linq méthode
Énumérable.ElementAt()
. Cependant, depuis le magasin de sauvegarde d'unSortedSet
est un rouge-noir arbre -- une hauteur équilibrée arbre binaire, l'accès à un élément à l'index parElementAt()
implique un arbre de marche — O(N), dans le pire des cas et O(N/2) sur la moyenne, pour se rendre à l'élément souhaité. À peu près la même que la traversée d'une liste liée individuellement pour accéder à la Nème de l'élément.Donc...pour les grands ensembles, les performances sont susceptibles d'être pauvres.
Si ce que vous voulez, c'est une collection unique qui offre tableau-comme sémantique, pourquoi ne pas rouler vos propres
IList<T>
de mise en œuvre qui permettrait de renforcer l'unicité, tout commeSorteSet<T>
n' (en ignorant ajoute des éléments qui existent déjà dans la collection). Utiliser unList<T>
comme le support de sauvegarde. Le maintenir dans la séquence triée de sorte que vous pouvez utiliser une recherche binaire pour déterminer si l'élément est ajouté existe déjà. Ou, tout simplement sous-typeList<T>
et de remplacer les méthodes appropriées pour obtenir la sémantique que vous voulez.SortedSet
viaElementAt()
. Pouvez-vous offrir une réponse à la question qui est plus efficace?Enumerable.ElementAt()
pour une raison...il y a certainement des occasions où il est pratique et idéal!ElementAt
pourIEnumerable<T>
s depuisIEnumerable<T>
n'est pas appliquer un certain ordre. Par exemple, des méthodes commeElementAt
,Last
etc ne fait pas de sens pour unHashSet<T>
. Néanmoins, vous pouvez mettre en œuvre unIndexedSortedSet<T>
pour éviter la recherche de peine, mais cela pourrait également signifier que vous dégraderAdd
etRemove
performance.EDIT: ordinaire (non ordonnée) telle que HashSet<T> gère ses éléments dans aucun ordre particulier. Ainsi, l'indice d'un élément particulier dans un non-ordonnée jeu n'a pas de signification particulière.
En revanche cependant, il fait sens sémantique à la demande d'un élément par sa position (index) dans un SortedSet<T>. Pourquoi s'embêter avec les frais généraux d'une collection ordonnée, sinon?
Cela dit, pour un petit SortedSet<T> où la performance n'est pas un sujet de préoccupation (voir exemple ci-dessous), l'extension Linq méthode Énumérable.ElementAt() fournit un moyen commode de la récupération d'un élément par son indice. Cependant, pour un grand SortedSet<T> où les performances d'exécution de la récupération d'un élément est d'une importance primordiale, envisager de mettre en œuvre une collection personnalisée comme @Nicolas Carey décrit dans sa réponse.
Réponse Originale À Cette Question:
Vous pouvez accéder à un élément d'intérêt par son index (position) de votre
SortedSet
via leÉnumérable.ElementAt<TSource>
méthode:Démonstration:
Résultat Attendu:
Si vous avez l'intention de charger les données dans un ensemble, puis d'accéder à l'ensemble, l'utilisation
HashSet
etImmutableSortedSet
au lieu deSortedSet
.Charger vos données dans le
HashSet
, puis d'appelerToImmutableSortedSet()
convertir à une immuable ensemble trié qui peuvent être indexés.vous pouvez utiliser MCollections qui n'insérer, de modifier, de supprimer, de recherche et d'index de recherche En O(Lg N)) de temps, il utilise de la STB et de stocker nombre de sous-nœuds dans chaque nœud d'accès à l'élément à l'index spécifié