2009-04-13 58 views
7

我有一個繼承自List<>的集合類。我已經成立了一個由功能有一定財產,像這樣對列表進行排序:在使用OrderBy()後返回正確的類型

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

當我嘗試使用排序的結果在我的代碼是這樣的:

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

我得到的錯誤:

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

考慮到VS告訴我存在一個明確的轉換,所以我添加了上面的演員。

如何正確投射IEnumerable<>到我的收藏?

回答

5

如果不瞭解更多關於PlayListCollection類型的信息,很難知道正確的答案。但假設它是一個標準樣式集合類,它具有一個構造函數,它採用IEnumerable <T>,那麼下面的代碼應該可以做到。

擴展方法

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

使用方法

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

如果沒有,請發表有關PlayListCollection更多的信息,尤其是構造函數和實現的接口,我們應該能夠幫助你與您的問題。

編輯

如果上面的代碼不工作,你可以使用下面的擴展方法創建PlaylistCollection類的一個實例。

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

雖然我以前已經嘗試過你的第一個建議,我與你的第二個建議,結合它和它的工作就好了。我最初就是這麼做的,我只是希望能有一個更優雅的解決方案。謝謝! – 2009-04-13 22:46:58

3

好像你正在尋找少怎麼投的結果,更如何將它塞進一個List<>。我一直在尋找一種簡單的方式做同樣的事情,發現了以下解決方案:

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

ToList擴展方法是在.NET 3.5可用。下面的鏈接包含附加信息:

Enumerable.ToList Method (MSDN)

Sorting a List<FileInfo> by creation date C#

相關問題