2009-04-13 4 views
7

Ho una classe di raccolta che eredita da List<>. Ho installato una funzione per ordinare l'elenco per una certa proprietà in questo modo:Restituzione del tipo corretto dopo l'utilizzo di OrderBy()

public PlaylistCollection SortByName(IEnumerable<Playlist> playlists) 
{ 
    return (PlaylistCollection)playlists.OrderBy(p => p.Name); 
} 

Quando provo ad utilizzare i risultati ordinati nel mio codice come questo:

artistSource.Playlists = (PlaylistCollection)new List<Playlist>(artistSource.Playlists.SortByName(artistSource.Playlists)); 

ottengo l'errore :

Unable to cast object of type 'System.Linq.OrderedEnumerable`2[...Playlist,System.String]' 
to type '...PlaylistCollection'." 

Questa è moderatamente frustrante considerando VS mi ha detto che esiste una conversione esplicita, così ho aggiunto il cast sopra.

Come faccio a trasmettere correttamente da IEnumerable<> alla mia raccolta?

risposta

5

È difficile sapere quale sia la risposta giusta senza capire di più sul tipo PlayListCollection. Ma supponendo che sia una classe di raccolta di stile standard che ha un costruttore che prende un oggetto IEnumerable <T>, il seguente codice dovrebbe fare il trucco.

Metodo di estensione

public IEnumerable<Playlist> SortByName(IEnumerable<Playlist> playlists) 
{ 
    return playlists.OrderBy(p => p.Name); 
} 

uso del metodo

var temp = artistSource.Playlists.SortByName(artistSource.Playlists); 
artistSource.PlayList = new PlaystListCollection(temp); 

In caso contrario, si prega di inviare ulteriori informazioni su PlayListCollection, in particolare, il costruttore e interfacce implementate, e dovremmo essere in grado di aiutarti con il tuo problema

EDIT

Se il codice di cui sopra non funziona è possibile utilizzare il seguente metodo di estensione per creare un'istanza della classe PlaylistCollection.

public static PlaylistCollection ToPlaylistCollection(this IEnumerable<Playlist> enumerable) { 
    var list = new PlaylistCollection(); 
    foreach (var item in enumerable) { 
    list.Add(item); 
    } 
    return list; 
} 
+0

Mentre io avevo provato il tuo primo suggerimento prima di già, ho combinato con il tuo secondo suggerimento e ha funzionato bene. All'inizio lo avrei fatto in quel modo, speravo solo in una soluzione più "elegante", immagino. Grazie! –

3

Sembra che cerchiate meno per come lanciare il risultato e più come roba in una List<>. Ero alla ricerca di un modo semplice per fare la stessa cosa ed ho trovato la seguente soluzione:

artistSource.PlayList = playlists.OrderBy(p => p.Name).ToList<PlayList>(); 

Il metodo di estensione ToList è disponibile in .NET 3.5. I seguenti link contengono informazioni aggiuntive:

Enumerable.ToList Method (MSDN)

Sorting a List<FileInfo> by creation date C#