2009-04-13 8 views
7

Tengo una clase de colección que hereda de List<>. He creado una función para ordenar la lista por una determinada propiedad, así:Devolver el tipo correcto después de usar OrderBy()

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

Cuando trato de utilizar los resultados ordenados en mi código como este:

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

consigo el error :

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

Esto es moderadamente frustrante teniendo en cuenta que VS me dijo que existe una conversión explícita, así que agregué el modelo anterior.

¿Cómo puedo emitir correctamente desde IEnumerable<> a mi colección?

Respuesta

5

Es difícil saber cuál es la respuesta correcta sin entender más sobre el tipo PlayListCollection. Pero suponiendo que es una clase de colección de estilo estándar que tiene un constructor tomando un IEnumerable < T , entonces el siguiente código debería ser el truco.

Método de extensión

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

uso del método

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

Si no es así, por favor publicará más información sobre playlistCollection, en particular, el constructor y las interfaces implementadas, y debemos ser capaces de ayudarle a cabo con tu problema

EDITAR

Si el código anterior no funciona, puede utilizar el siguiente método de extensión para crear una instancia de la clase playlistCollection.

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

Si bien había intentado su primera sugerencia antes ya, combinado con su segunda sugerencia y funcionó muy bien. Lo habría hecho así al principio, supongo que esperaba una solución más 'elegante'. ¡Gracias! –

3

Parece que estás buscando menos por la forma de emitir el resultado y más cómo rellenarlo en un List<>. Yo estaba buscando una manera simple de hacer lo mismo y encontré la siguiente solución:

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

El método de extensión ToList está disponible en .NET 3.5. Los siguientes enlaces contienen información adicional:

Enumerable.ToList Method (MSDN)

Sorting a List<FileInfo> by creation date C#

Cuestiones relacionadas