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

我有一个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);

}


慕的地10843
浏览 479回答 3
3回答

慕尼黑8549860

B“高我知道这很旧。但是为什么解决方案不简单?var o = beatles.GroupBy(x => x.inst)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.SelectMany(g =>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;g.Select((j, i) => new { j.inst, j.name, rn = i + 1 })&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;);

慕哥9229398

正如@The_Smallest所指出的,LINQ不支持行号。不过,您可以通过以下方式找到想要的东西:var grouped = beatles.OrderBy( x => x.id )&nbsp; .ToList()&nbsp; &nbsp;// required because SelectMany below doesn't evaluate to SQL&nbsp; .GroupBy( x => x.inst );var rns = grouped.ToDictionary( x => x.Key, x => 1 );var result = grouped&nbsp; .SelectMany( x => x.Select(&nbsp;&nbsp; &nbsp; y => new { inst = y.inst, name = y.name, rn = rns[y.inst]++ } ) );
打开App,查看更多内容
随时随地看视频慕课网APP