2010-04-23 28 views
3

Je dois avoir des objets triés par prix valeur (décimale) pour un accès rapide. Je dois être en mesure de trouver tous les objets avec le prix plus de A ou moins de B. Je pensais à SortedList, mais cela ne permet pas de trouver un énumérateur ascendant ou descendant à partir d'une valeur de clé donnée (par exemple, donnez-moi tous les objets dont le prix est inférieur à 120 $). Pensez à un système qui accepte les voitures à vendre des vendeurs et les stocke dans cette collection. Alors les acheteurs veulent trouver des voitures moins chères que 1000 $.Besoin de trier le dictionnaire conçu pour trouver des valeurs avec des clés inférieures ou supérieures à la valeur de recherche

Fondamentalement, ce dont j'ai besoin est une collection arborescente et une fonctionnalité pour trouver un nœud plus petit \ plus grand que la clé fournie.

Veuillez nous consulter.

+0

Comme je comprends, vous devez stocker des objets dans la mémoire en quelque sorte et être en mesure de sélectionner certains d'entre eux rapidement. Pourquoi demandez-vous à ce sujet? (Peut-être avez-vous des détails?) De telles opérations sont si rapides (parce que tout est en mémoire, au lieu de requêtes SQL) que vous devez simplement aller de l'avant et implémenter cela d'une manière ou d'une autre. Vous pouvez encapsuler la logique dans une classe et fournir une interface. Quand les temps durs viennent (s'ils viennent jamais) vous devez profiler et optimiser votre classe (l'interface devrait être constante). Et pour la première implémentation de votre classe, la solution de Marcelo Cantos est assez bonne. N'ayez pas peur de LINQ :) –

+0

duplicata possible de [Trouver efficacement la plus proche clé de dictionnaire] (http://stackoverflow.com/questions/12412869/efficiently-find-nearest-dictionary-key) – nawfal

Répondre

4

La réponse dépend de vos habitudes d'utilisation. Si ce un exercice unique de consommer une entrée non triés défini et trouver des objets appropriés, vous êtes beaucoup mieux juste LINQ:

list.Where(e => A < e.Price || e.Price < B); 

Si la liste est statique, et que vous souhaitez interroger plusieurs plages, puis coller les objets dans un tableau, les trier par prix, puis utilisez une côtelette binaire pour trouver des plages d'intérêt.

+0

Je n'ai pas besoin de fermer gamme, juste moins OU plus grand –

+1

C'est un changement assez simple. –

+1

C'est en effet. Je suis réticent à utiliser LINQ en raison de problèmes de performances. –

5

Vous pouvez utiliser BinarySearch sur SortedList pour rechercher les index premiers et derniers répondant à vos conditions, puis obtenir la plage d'éléments de la liste.

2

Pensez à une liste triée. Vous pouvez également utiliser n'importe quelle collection et l'interroger avec LINQ. Par exemple générique simple Liste:

 List<Int32> tempList = new List<Int32>(); 

     tempList.Where(singleItem => singleItem > 100) 
      .ToList<Int32>();