2009-04-13 4 views
7

私はList<>から継承するコレクションクラスを持っています。私はそうのような特定のプロパティでリストをソートする機能を設定している:OrderBy()を使用した後に適切な型を返す

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

を私はエラーを取得:

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

私はこのように私のコードでソートされた結果を使用しようと

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に関する詳細な情報を投稿してください、と私たちはあなたを助けることができるはずですあなたの問題と一緒に。

EDIT

上記のコードは動作しない場合は、PlaylistCollectionクラスのインスタンスを作成するには、次の拡張メソッドを使用することができます。

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

:以下のリンクは、追加情報が含まれています。私はそれを最初からやっていたでしょうが、私はちょうどもっとエレガントなソリューションを望んでいたと思います。ありがとう! –

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#

関連する問題