小编典典

Linq中的行数超过(按xxx划分)?

c#

我有一个DataTable具有以下结构和数据的:

id | 仪器 名称
------------------------
 1 | 吉他| 约翰
 2 | 吉他| 乔治
 3 | 吉他| 保罗
 4 | 鼓| 林戈
 5 | 鼓| 皮特

我可以这样检索记录:

IEnumerable <Beatle>...

class Beatle
{
  int id;
  string inst;
  string name;
}

我想获得演奏不同乐器的人的内部秩序。在MSSQL中,我会使用

SELECT 
    *
    ,Row_Number() OVER (PARTITION BY inst ORDER BY id) AS rn
FROM Beatles

该查询返回

id | 仪器 名称| rn
-----------------------------
 1 | 吉他| 约翰| 1个
 2 | 吉他| 乔治| 2
 3 | 吉他| 保罗| 3
 4 | 鼓| 铃声 1个
 5 | 鼓| 皮特| 2

我如何在 Linq中 做到这一点?

编辑(接受答案后)

完整的工作代码:

var beatles = (new[] { new { id=1 , inst = "guitar" , name="john" },
    new { id=2 , inst = "guitar" , name="george" },
    new { id=3 , inst = "guitar" , name="paul" },
    new { id=4 , inst = "drums" , name="ringo" },
    new { id=5 , inst = "drums" , name="pete" }
});

var o = beatles.OrderBy(x => x.id).GroupBy(x => x.inst)
               .Select(g => new { g, count = g.Count() })
               .SelectMany(t => t.g.Select(b => b)
                                   .Zip(Enumerable.Range(1, t.count), (j, i) => new { j.inst, j.name, rn = i }));

foreach (var i in o)
{
    Console.WriteLine("{0} {1} {2}", i.inst, i.name, i.rn);
}

阅读 322

收藏
2020-05-19

共1个答案

小编典典

B“高

我知道这很旧。但是为什么解决方案不简单?

var o = beatles.GroupBy(x => x.inst)
               .SelectMany(g =>
                   g.Select((j, i) => new { j.inst, j.name, rn = i + 1 })
               );
2020-05-19