使用OrderBy()后返回正确的类型

时间:2009-04-13 22:08:42

标签: c# linq generics casting

我有一个继承自List<>的集合类。我已经设置了一个函数来按照某个属性对列表进行排序:

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<>正确地投射到我的收藏中?

2 个答案:

答案 0 :(得分:5)

如果不了解PlayListCollection类型的更多信息,很难知道正确答案是什么。但假设它是一个标准样式集合类,它有一个构造函数采用IEnumerable&lt; T&gt;,那么下面的代码应该可以解决问题。

扩展方法

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;
}

答案 1 :(得分:3)

似乎你对于如何投射结果以及如何将其填充到List<>中的方式更少。我一直在寻找一种简单的方法来做同样的事情,并找到了以下解决方案:

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

.NET 3.5中提供了ToList扩展方法。以下链接包含其他信息:

Enumerable.ToList Method (MSDN)

Sorting a List<FileInfo> by creation date C#