2009-04-13 9 views
7

Mam klasę kolekcji dziedziczącą po List<>. Wcześniej skonfigurować funkcję, aby posortować listę według niektórych właściwości tak:Powracanie odpowiedniego typu po użyciu polecenia OrderBy()

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

Kiedy próbuję użyć posortowane wyniki w moim kodu tak:

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

pojawia się błąd :

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

jest umiarkowanie frustrujące rozważa VS powiedział mi, że istnieje wyraźna przemiana, więc dodałem wyżej obsady.

Jak prawidłowo rzucić z IEnumerable<> do mojej kolekcji?

Odpowiedz

5

Trudno powiedzieć, jaka jest właściwa odpowiedź, nie rozumiejąc więcej o typie PlayListCollection. Ale zakładając, że jest to standardowa klasa kolekcji, która ma konstruktora pobierającego IEnumerable <T>, to poniższy kod powinien załatwić sprawę.

metodę rozszerzenia

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

metodą

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

Jeśli nie, proszę pisać więcej informacji o PlayListCollection, w szczególności konstruktor i wdrożone interfejsów, a my powinniśmy być w stanie pomóc z twoim problemem.

EDIT

Jeżeli powyższy kod nie działa, można użyć następującej metody rozszerzenie do utworzenia instancji klasy PlaylistCollection.

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

Chociaż próbowałem swoją pierwszą propozycję już wcześniej, że łączy go z drugiej sugestii i to działało dobrze. Zrobiłbym to tak na początku, po prostu liczyłem na bardziej "eleganckie" rozwiązanie, jak sądzę. Dzięki! –

3

Wydaje szukasz mniej za jak rzucić wynik i więcej jak nadziać go na List<>. Szukałem prosty sposób zrobić to samo i znalazł następujące rozwiązanie:

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

ToList metoda rozszerzenie jest dostępne w .NET 3.5. Poniższe linki zawierają dodatkowe informacje:

Enumerable.ToList Method (MSDN)

Sorting a List<FileInfo> by creation date C#

Powiązane problemy