linq操作DataTable计算排名的问题
我有一个DataTable存储有学生的成绩,我想要对其进行计算排名,想用linq实现,现在使用如下代码,想请教一下各位强人,是否有更简洁快速的方法?
void testLinq() { DataTable dt = new DataTable(); dt.Columns.Add("成绩"); dt.Columns.Add("排名"); dt.Rows.Add(new object[] { 12, null }); dt.Rows.Add(new object[] { 120, null }); dt.Rows.Add(new object[] { 92, null }); System.Diagnostics.Debug.WriteLine("成绩 排名"); foreach (DataRow row in dt.Rows) { float cj = float.Parse(row["成绩"].ToString()); //Linq操作DataTable: int rank = (from dt1 in dt.AsEnumerable() where float.Parse(dt1.Field<string>("成绩")) > cj//条件 select dt1).Count() + 1; /*IEnumerable<DataRow> rows = dt.AsEnumerable().Where(t => (float.Parse(t.Field<string>("成绩")) > cj)); int rank = rows.Count() + 1;*/ row["排名"] = rank; System.Diagnostics.Debug.WriteLine(cj.ToString()+" "+rank.ToString()); } }输出:
成绩 排名
12 3
120 1
92 2
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
非常感谢。。。
楼上有点偏了。如果愿意牺牲一点空间的话,直接select出来所有成绩排序后转成数组,循环所有datarow赋值成绩在数组里的index就行了。
详细点?我希望是不修改原DataTable表中各数据的排序,增加排名数据。
回复
手头没有环境, 最迟下午答复你...
居然百度不到System.Interactive,还是得谷歌,MoreLinq?
代码中将成绩都当作int处理了,不太合适,成绩可以有小数的如96.5分
回复
int那个只是例子罢了你可以自由设置数据类型. 至于Interactive, 使用nuget插件在线搜索"ix", 选择安装Ix-main即可
非常感谢。
麻烦之处主要在于需要处理成绩相同的排名问题,比如最高分两个100,那么99分的排名是第三之类的。再就是这个DataTable如果是能手工设计的话程序会更容易一些,比如:
其中Distinct和ForEach来自官方System.Interactive扩展。