Elenco C # < T > OrderBy restituisce sempre null
-
06-07-2019 - |
Domanda
Ecco la mia configurazione.
public class ItemList : List<Item>
{
public void Load() {...}
public void Save() {...}
}
Carica letture da un file XML per popolare la ItemList
Provo quindi a ordinare l'elenco degli articoli in base a una priorità. Questo è un int? Ai fini del test, tuttavia, tutti gli articoli hanno un valore diverso.
ItemList itemList = new ItemList();
itemList.Load();
ItemList newItemList = itemList
.OrderBy(item => item.Priority) as ItemList;
return newItemList;
In newItemList sopra è sempre nullo. itemList ha un conteggio di 7. Ho controllato tre volte e tutti gli elementi nell'istanza itemList hanno una priorità impostata.
Cosa sto sbagliando?
Ho anche provato ...
ItemList newItemList = itemList
.OrderBy(item => item.Priority)
.ToList() as ItemList;
Nulla sembra funzionare.
Grazie in anticipo!
Soluzione
Né OrderBy né ToList restituiscono un ItemList, quindi il casting restituisce null, come ha sottolineato Joseph.
Poiché stai ereditando dalla classe Elenco < T >
, puoi semplicemente utilizzare il metodo Sort per ordinarlo:
ItemList itemList = new ItemList();
itemList.Load();
itemList.Sort((x, y) => x.Priority.CompareTo(y.Priority));
return itemList;
Altri suggerimenti
Il problema è che OrderBy non restituisce un ItemList, restituisce un IOrderedEnumerable e ToList () non restituisce un ItemList, ma restituisce un Elenco. Ad ogni modo, stai provando a trasmettere entrambi a un ItemList, che non lo sono, quindi ottieni 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();
Penso che il tuo problema sia il " come ItemList " ;.
Gli operatori LINQ non funzionano sul posto sul tuo nuovo oggetto ItemList. Creano e restituiscono nuovi oggetti. Se desideri eseguire l'ordinamento sul posto, devi utilizzare il metodo Sort () di Elenco < > ;.