2010-03-03 8 views
2

Je suis assez nouveau pour C# et complètement nouveau à LINQ.LINQ de SortedList C#

J'ai un objet existant de type SortedList, que je voudrais filtrer LINQ. Cependant, je semble avoir des problèmes avec cela, apparemment parce que le type SortedList n'est pas générique.

Pour le timebeing je l'ai mis en boucle à travers l'ensemble SortedList et ajoutés manuellement les objets dans une liste et utilisé LINQ pour filtrer à partir de là. Cependant, cela me semble, bien, des ordures.

Existe-t-il un meilleur moyen de convertir mes SortedList en Liste <> (Je ne suis pas dérangé par la préservation de la clé)? Ou en effet pour convertir mon SortedList à SortedList <> peut-être?

+0

quelques exemples de code et des données? – amelvin

+0

Avez-vous besoin de filtrer sur SortedList.Keys? – si618

Répondre

3

classe d'origine SortedList fait partie de la collection. Generics introduit SortedList mais si vous avez un ancien code, il ne l'utilisera pas.

Le plus simple est d'utiliser la méthode Cast ou méthode d'extension OfType qui est disponible pour SortedList. Ces méthodes vous donneront la liste IEnumerable que vous pouvez appliquer des opérations Linq génériques. Assurez-vous d'inclure using System.Linq; au début, alors vous devriez être en mesure de le faire comme ci-dessous:

sortedList.Cast<int>().Where(i=>i > 5); 
sortedList.OfType<Car>().Where(c=> c.Color == Color.Blue); 
+0

Je ne crois pas que DictionaryEntry puisse être converti en int; Vous devrez spécifier des clés ou des valeurs. – si618

+0

Ce qui précède est juste un exemple, vous pouvez le mouler à tout ce qui vous convient. Ce qu'il dit dans l'exemple ci-dessus est jeté la collection SortedList dans un IEnumerable (ou tout ce que vous aimez en remplaçant l'int yourType) et bien sûr la coulée échouera si le type de correspondance ne marche pas. La spécification de la méthode est Cast où T est un type paramétré –

0

Si vous n'avez pas besoin de filtrer par clés, juste jeter et le filtre sur les valeurs

SortedList sl = new SortedList(); 
sl.Add("foo", "baa"); 
var baas = sl.Values.Cast<string>().Where(s => s == "baa"); 
0

Qu'est-ce que à propos de

normalList = sortedList.Items; 

Est-ce que cela vous donne la liste que vous voulez?

0

Pour répondre à la question "Existe-t-il un meilleur moyen de convertir mon SortedList en Liste <> (Je ne suis pas dérangé par la préservation de la clé)?" ... Voici un exemple, avec la dernière ligne comme réponse dans la liste avec des nombres entiers de 4, 1, 3, 2:

SortedList<string,int> sortedList = new SortedList<string,int>(); 
sortedList.Add("One", 1); 
sortedList.Add("Two", 2); 
sortedList.Add("Three", 3); 
sortedList.Add("Four", 4); 
List<int> list = sortedList.Values.ToList();