【问题标题】:Ordering items by grouped quantity按分组数量订购商品
【发布时间】:2015-10-01 19:34:17
【问题描述】:

我想根据用户发布帖子的次数来排序一些帖子。

我有以下几点:

IList<User> orderTopContributors = 
    this.GetPosts()
    .GroupBy(x => x.Author.Id)
    .Select(x => new
    {
        AuthorCount = x.Count()
    })
    .OrderByDescending( x => x.AuthorCount )
    .ToList();

我哪里出错了?转换有错误:

严重性代码描述项目文件行错误CS0266不能 将类型“System.Collections.Generic.List>”隐式转换为 'System.Collections.Generic.IList'。显式转换 存在(您是否缺少演员表?)

【问题讨论】:

  • OrderByDescending
  • 感谢您的关注,呵呵。
  • 当您应用Select 子句时,您会得到一个IEnumerable 对象,其元素是Select 中定义的新类型,因此,当您在Select 子句中添加“新”时, Linq 返回一个IEnumerable 新类型列表。

标签: c# linq


【解决方案1】:

tl;dr:使用SelectMany 方法

你有几个错误:

  • 首先(您在编辑中修复了这个问题),您应该使用OrderByDescending 来获得从最大到最大的顺序最小。

  • 下一个 (你在编辑中修复了这个),你期待收到IList&lt;User&gt;,将其更改为 IEnumrable&lt;User&gt; 或在 Linq 末尾添加 .ToList()。

  • 最后,如果您想将您的群组扁平化为单个列表,请使用 SelectMany 并选择扁平化列表:

示例代码:

IList<User> orderTopContributors = GetPosts()
    .GroupBy(x => x.Id)
    .Select(x => new
    {
        AuthorCount = x.Count(),
        Posts = x
    })
   .OrderByDescending(x => x.AuthorCount)
   .SelectMany(x => x.Posts)
   .ToList();

当您使用.GroupBy 时,您将IEnumerable&lt;User&gt; 转换为IEnumerable&lt;IEnumerable&lt;User&gt;&gt;,因为有很少的组(很多倍),通过使用SelectMany 方法,您声明哪个@987654335 @你想从每个组中取出并聚合到最终结果:

伪示例:

var Users = new List<User>
{
    { UserID = 576, PostId = 7 },
    { UserID = 576, PostId = 4 },
    { UserID = 4, PostId = 2 },
    { UserID = 2, PostId = 5 },
    { UserID = 2, PostId = 1 },
    { UserID = 576, PostId = 9 }
}

var Ordered = Users
    .GroupBy(x => x.UserID)
    .Select(x => new
    {
        AuthorCount = x.Count(),
        Posts = x
    })
    .OrderByDescending(x => x.AuthorCount)
    .SelectMany(x => x.Posts)
    .ToList();

Ordered 现在是:

List<User>
{
    { UserID = 576, PostId = 7 },
    { UserID = 576, PostId = 4 },
    { UserID = 576, PostId = 9 },
    { UserID = 2, PostId = 5 },
    { UserID = 2, PostId = 1 },
    { UserID = 4, PostId = 2 }
}

【讨论】:

  • 我稍微修改了我的问题,不知道它是如何令人困惑的
  • 阅读我写的关于.SelectMany()的内容
  • 谢谢,我会把你的代码改成解决方案,我也是菜鸟
猜你喜欢
  • 2019-05-29
  • 1970-01-01
  • 2017-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-08
相关资源
最近更新 更多