为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
慕的地10843 2019-10-09 17:02:21
我有一个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 rnFROM 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);}
查看完整描述

3 回答

?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

B“高


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


var o = beatles.GroupBy(x => x.inst)

               .SelectMany(g =>

                   g.Select((j, i) => new { j.inst, j.name, rn = i + 1 })

               );


查看完整回答
反对 回复 2019-10-09
?
慕哥9229398

TA贡献1877条经验 获得超6个赞

正如@The_Smallest所指出的,LINQ不支持行号。不过,您可以通过以下方式找到想要的东西:


var grouped = beatles.OrderBy( x => x.id )

  .ToList()   // required because SelectMany below doesn't evaluate to SQL

  .GroupBy( x => x.inst );

var rns = grouped.ToDictionary( x => x.Key, x => 1 );

var result = grouped

  .SelectMany( x => x.Select( 

    y => new { inst = y.inst, name = y.name, rn = rns[y.inst]++ } ) );


查看完整回答
反对 回复 2019-10-09
  • 3 回答
  • 0 关注
  • 478 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信