2009-10-23 5 views
1

Voici ma configuration.C# Liste <T> OrderBy toujours retourner null

public class ItemList : List<Item> 
{ 
    public void Load() {...} 
    public void Save() {...} 
} 

charge lit à partir d'un fichier XML pour remplir le ItemList

je tente alors de commander la liste des éléments par une priorité. C'est un int? Pour les besoins du test, cependant, tous les éléments ont une valeur différente.

ItemList itemList = new ItemList(); 
itemList.Load(); 

ItemList newItemList = itemList 
         .OrderBy(item => item.Priority) as ItemList; 

return newItemList; 

Dans ce qui précède, newItemList est toujours null. itemList a un nombre de 7. J'ai triplé et tous les éléments de l'instance itemList ont un ensemble de priorités.

Qu'est-ce que je fais mal?

J'ai aussi essayé ...

ItemList newItemList = itemList 
         .OrderBy(item => item.Priority) 
         .ToList() as ItemList; 

Rien ne semble fonctionner.

Merci d'avance!

Répondre

2

Ni OrderBy ou ToList retourne un ItemList, de sorte que la coulée retourne nulle, comme Joseph a souligné.

Comme vous héritez de la classe List<T>, vous pouvez simplement utiliser la méthode de tri pour trier:

ItemList itemList = new ItemList(); 
itemList.Load(); 
itemList.Sort((x, y) => x.Priority.CompareTo(y.Priority)); 
return itemList; 
+0

J'essaie d'éviter d'utiliser Sort, car si je ne me trompe pas, ce que je suis souvent, il faut construire des méthodes CompareTo pour tout ce que je veux trier. – Altonymous

+0

BTW, Lorsque j'essaie d'utiliser cette solution, CompareTo n'est pas une méthode valide hors priorité. La priorité est un int? – Altonymous

+0

J'ai compris! itemList.Sort ((x, y) => x.Priority.HasValue.CompareTo (y.Priority)); – Altonymous

7

Le problème est que OrderBy ne retourne pas une ItemList, il renvoie un IOrderedEnumerable, et ToList() ne renvoie pas une ItemList, il retourne une List. Dans les deux cas, vous essayez de convertir les deux en ItemList, ce qui n'est pas le cas, donc vous obtenez null.

ItemList someList = (new ItemList {new Item(2), new Item(1), new Item(3)}); 

//this returns an IOrderedEnumerable<Item> 
var result = someList.OrderBy(i => i.Priority); 

//this returns a List<Item> 
var otherResult = someList.ToList(); 
+0

Merci pour l'explication maintenant, je viens de comprendre comment utiliser OrderBy et finissent avec un ItemList. Je ne veux pas utiliser Sort car je ne veux pas construire des méthodes CompareTo pour tout. Quand j'essaie d'utiliser la solution ci-dessous qui utilise Trier CompareTo n'est pas une méthode valable de priorité, et la priorité est un int? – Altonymous

+0

J'ai compris! itemList.Sort ((x, y) => x.Priority.HasValue.CompareTo (y.Priority)); – Altonymous

+0

Pas la réponse ... ne pensait pas à travers ... Lorsque j'utilise HasValue, il essaie de comparer le résultat de HasValue, qui est un booléen, à la priorité. Toujours en train de travailler dessus! – Altonymous

0

Je pense que votre problème est le "en tant que ItemList".

+0

Cela ne fonctionnera pas non plus car le résultat ne peut pas être converti en ItemList. –

+0

Bon point. Je ne tenais pas compte de la nécessité de remonter la liste au type ItemList. – CodingWithSpike

0

Les opérateurs LINQ ne fonctionne pas en place sur votre objet newItemList. Ils créent et retournent de nouveaux objets. Si vous souhaitez effectuer un tri sur place, vous devez utiliser la méthode Sort() de la liste <>.

Questions connexes