【问题标题】:Returning proper type after using OrderBy()使用 OrderBy() 后返回正确的类型
【发布时间】:2009-04-13 22:08:42
【问题描述】:

我有一个继承自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&lt;&gt; 投射到我的收藏中?

【问题讨论】:

    标签: c# linq generics casting


    【解决方案1】:

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

    扩展方法

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

    【讨论】:

    • 虽然我之前已经尝试过你的第一个建议,但我将它与你的第二个建议结合起来,效果很好。我最初会这样做,我只是希望有一个更“优雅”的解决方案,我猜。谢谢!
    【解决方案2】:

    您似乎不太关注如何转换结果,而更多地关注如何将其填充到 List&lt;&gt; 中。我一直在寻找一种简单的方法来做同样的事情,并找到了以下解决方案:

    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#

    【讨论】:

      猜你喜欢
      • 2020-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-26
      • 2011-02-24
      相关资源
      最近更新 更多