EDIT: Credo che questo sia ciò che si vuole:
Se non ti dispiace di smistamento 'fuori luogo' e riassegnazione della lista, questo dovrebbe funzionare:
collection = collection.GroupBy(item => item.GetType())
.SelectMany(g => g)
.ToList();
o a seconda della esigenze, qualcosa come:
collection = collection.OrderBy(item => item.GetType().FullName)
.ToList();
se deve essere sul posto, quindi scrivendo un operatore di confronto personalizzato e list.Sort
è probabilmente la scelta migliore.
Per raggruppare gli elementi per tipo, è possibile utilizzare GroupBy
:
var groupedItems = collection.GroupBy(item => item.GetType());
Questo utilizza esecuzione differita.
In alternativa, è possibile inserire i 'gruppi' in un data-struttura come questa:
var itemsByTypeLookUp = collection.ToLookup(item => item.GetType());
foreach(A a in itemsByTypeLookUp[typeof(A)])
{
...
}
Se sei solo alla ricerca di un certo tipo:
var itemsOfTypeA = collection.OfType<A>();
@Anthony: Sì, non è possibile effettuare il check in per null. In questo momento, qualsiasi cosa diversa da A o B sarà trattata come B, anche ... –
Sì, ho dato un'altra occhiata a esso, e si scopre che non è * esattamente * quello che vorrei andare lontano a causa di non contabilizzare per tipo ' C: Base'. Probabilmente fare 'a.GetType(). Name.CompareTo (b.GetType(). Name') (e qualunque verifica nulla, dovrebbero essere rilevanti). Ma chissà, forse ci sono solo due tipi, e forse 'A' è in realtà' Foo' e 'B' è in realtà' Bar' e 'Foo' dovrebbe venire prima di' Bar'. –
@Anthony: non c'è davvero abbastanza informazione nella domanda originale per determinarlo completamente - questo ti dà più controllo su come avviene l'ordinamento, ma è difficile sapere cosa l'OP vuole davvero ... –