2010-08-29 17 views
2

Idiot si vous me demandez. Mais ce message est ici parce que je vais supposer (probablement correctement) que je suis le sot, pas Microsoft. Alors ... y a-t-il quelque chose qui me manque? Pourquoi n'ont-ils pas inclus une méthode "Trouver" à ce bébé? La découverte pourrait travailler sur les valeurs, qui sont des objets, donc alors je pourrais le faire:Pourquoi SortedList en C# n'a-t-il pas de méthode Find?

someObject = SortedList.Values.Find(order => order.OrderID == orderID); 
+0

listes triées sont conçues pour supporter recherche efficace en utilisant la clé. Si vous avez besoin de chercher dans la liste en utilisant d'autres critères, alors il peut être judicieux d'utiliser le 'OrderID' comme clé dans la liste, peut-être (sauf si vous n'en avez besoin que très rarement ...)? –

+0

J'ai la liste triée par DateTime. C'est pourquoi j'ai utilisé un SortedList. – Axonn

Répondre

5

Vous cherchez peut-être .First(...) ou .Single(...) (ou leurs OrDefault variantes) dans LINQ, mais qui ne fonctionne que très bien avec types qui implémentent IEnumerable<T>. Un SortedList n'est pas fortement typé, par conséquent le Lambda ne fonctionnera pas. Jetez un oeil à .Cast<T>() de LINQ.

+0

Je n'utilise pas LINQ dans ce projet. IndexOfKey n'est pas utile. Je cherche un certain objet avec un certain ID. – Axonn

0

Voulez-vous dire this la méthode contient

+0

Salut. Non ::-). Je cherche à trouver un certain ID, qui est membre de TValue. – Axonn

+0

Pourquoi ContainsValue échouerait-il à ce critère? – Woot4Moo

+0

Parce que mon objet (valeur) est un ShopOrder, pas un int. – Axonn

5

Vous voulez probablement:

SortedList.Values.Cast<Order>().FirstOrDefault(order => order.OrderID == orderID); 

de couse, si vous parlez SortedList<TKey, TValue>, l'appel à Cast() est inutile. Par exemple, si vous parcourez le Values d'un SortedList de cette manière, il y a de bonnes chances que vous utilisiez un mauvais choix pour la clé/n'utilisiez pas la mauvaise structure de données.

EDIT:

Si vous ne pouvez pas utiliser LINQ dans le projet, ne souhaitez-vous maintenir séparées des structures de données calées par la date de l'ordre et orderID respectivement (comme suggéré par Ben Voigt), je voir pas d'autre choix que de mettre en œuvre la recherche vous-même:

foreach(ShopOrder order in sortedList.Values) 
{ 
    if(order.OrderID == orderID) return order; 
} 

return null; // or throw an exception, whichever you find appropriate. 

Si vous voulez généraliser davantage, écrire votre propre implémentation FirstOrDefault.

+0

Ma déclaration est SortedList orders = new SortedList (comparateur); Le comparateur est un simple datetime. J'ai reçu plus de commandes et j'ai besoin de les trier par DateTime mais je veux aussi trouver rapidement un identifiant de commande. Je pense que c'est la bonne structure à utiliser. Et je n'utilise pas LINQ btw, donc je ne vois pas "FirstOrDefault" :: - (. – Axonn

+1

@ Axonn - Au moins dans un sens de complexité temporelle, vous ne pouvez pas trouver "rapidement" un ID de commande avec cette structure de données. Si vous ne pouvez pas utiliser LINQ, êtes-vous sur une version antérieure à .NET 3.5? – Ani

+2

Ensuite, vous pourriez vouloir deux collections: une 'SortedList ' et un 'Dictionary ' qui permet –

1

Cherchez-vous sur le même champ que la liste par tri? Une recherche binaire serait la plus rapide, et SortedList fournit la fonction IndexOfKey pour le faire.

Il semble que vous recherchiez les valeurs, auquel cas vous devez utiliser le FirstOrDefault de LINQ sur le résultat de GetValueList.

Voir aussi: http://social.msdn.microsoft.com/Forums/en-US/csharplanguage/thread/55241049-7e7e-4006-8e04-70779698d609

+0

Je n'utilise pas de LINQ dans ce projet. n'est pas utile, je cherche un certain objet avec un certain identifiant. – Axonn