【问题标题】:How to use Linq to group every N number of rows如何使用Linq对每N行进行分组
【发布时间】:2017-04-08 00:14:17
【问题描述】:

我找不到实现这项工作的方法,希望有人有想法。一个简化的例子是有一个说整数 1-100 的列表,我想每 3 行分组,所以结果将是第一组中的 1,2,3,然后是下一组中的 4,5,6,等等。我知道如何获取每第 n 条记录,但我需要的是所有记录,以便我可以使用 first、last、sum、max 等聚合它们。

谢谢!

【问题讨论】:

标签: c# linq group-by


【解决方案1】:

这个例子应该适用于查询非数字集合。它将索引投影到要分组的对象中,然后在分组期间再次将其删除。

var studentQuery2 = students
    .Select((student, index) => new {student, index})
    .GroupBy(g => g.index / 3, i => i.student);

【讨论】:

  • 也谢谢,但是索引从何而来?
  • 我希望选择将其索引投影到查询中。好像没有。我将相应地更新示例 - 以便您可以将它与基于非 int 的集合一起使用。
  • 仅供参考,在框架的下一个版本中将有一个“zip join”扩展方法。如果使用无限的整数序列压缩查询结果,则会得到一个索引序列。有关详细信息,请参阅我最近关于此主题的博客文章。
  • 很好 - 我一定会期待这个功能。
  • @eric - 谢谢,我要试试。这比使用带索引的选择更快吗?
【解决方案2】:
var q = Enumerable.Range(0, 100).GroupBy(x => x/3);

我错过了什么吗?

【讨论】:

  • 学究气 - Enumerable.Range(1, 100) 因为他想从 1 开始。
  • 如果第一个数字是0,它工作正常。但如果第一个数字是 1,则第一组的元素少一个。例如 {0,1,2}、{3,4,5},但 {1,2}、{3,4,5}。如何解决这个问题?
【解决方案3】:

如何更简单的方法:

var index = 0;
var grpOf3s = students.GroupBy(x => index++ / 3);

更新: 如果您使用组项的Key 值,则需要将组可枚举转换为列表。否则每次访问都会得到不同的Key

var index = 0;
var grpOf3s = students.GroupBy(x => index++ / 3).ToList();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-01
    • 1970-01-01
    • 2014-01-06
    • 2016-01-16
    相关资源
    最近更新 更多