2009-04-13 6 views
7

J'ai une classe de collection qui hérite de List<>. J'ai mis en place une fonction pour trier la liste par une propriété comme ceci:Retour du type correct après l'utilisation de OrderBy()

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

Lorsque je tente d'utiliser les résultats triés dans mon code comme ceci:

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

Je reçois l'erreur :

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

Ceci est modérément frustrant étant donné que VS m'a dit qu'une conversion explicite existe, j'ai donc ajouté la distribution ci-dessus.

Comment puis-je diffuser du IEnumerable<> correctement dans ma collection?

Répondre

5

Il est difficile de savoir quelle est la bonne réponse sans en savoir plus sur le type PlayListCollection. Mais en supposant que c'est une classe de collection de style standard qui a un constructeur prenant un IEnumerable <T>, alors le code suivant devrait faire l'affaire.

Méthode d'extension

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

Utilisation de la méthode

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

Sinon, s'il vous plaît poster plus d'informations sur PlayListCollection, en particulier le constructeur et les interfaces mises en œuvre, et nous devrions être en mesure de vous aider avec votre problème.

EDIT

Si le code ci-dessus ne fonctionne pas, vous pouvez utiliser la méthode d'extension suivante pour créer une instance de la 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

Pendant que j'avais essayé votre première suggestion avant déjà, je l'ai combiné avec votre deuxième suggestion et cela a fonctionné très bien. Je l'aurais fait comme ça au début, j'espérais juste une solution plus 'élégante', je suppose. Merci! –

3

Il semble que vous cherchez moins pour savoir comment jeter le résultat et plus comment farcir dans un List<>. Je cherchais un moyen simple de faire la même chose et trouvé la solution suivante:

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

La méthode d'extension ToList est disponible dans .NET 3.5. Les liens suivants contiennent des informations supplémentaires:

Enumerable.ToList Method (MSDN)

Sorting a List<FileInfo> by creation date C#

Questions connexes