C# datatable 分组后排名

pandingquan0502 2012-05-22 07:22:20
datatable 结构 如下
姓名 语文 数学 英语
张三 60 70 88
李四 70 60 67
王五 90 90 77
赵六 99 90 89

想要的datatable结果为:
姓名 语文 数学 英语 语文名次 数学名次 英语名次
张三 60 70 88 4 2 2
李四 70 60 67 3 3 4
王五 90 90 77 2 1 3
赵六 99 90 89 1 1 1
...全文
442 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
yctcsms 2013-09-22
  • 打赏
  • 举报
回复
  Dim temp As DataTable

        Dim dv As DataView

        dv = dt.DefaultView
        dv.Sort = "语文 asc"

        temp = dv.ToTable


        temp.Columns.Add("_pm", System.Type.GetType("System.Decimal"))
        Dim x As Integer = 1
        For i As Integer = 0 To temp.Rows.Count - 1
            temp.Rows(i).Item("_pm") = x

            If i <> temp.Rows.Count - 1 Then
                If temp.Rows(i).Item("语文").ToString <> temp.Rows(i + 1).Item("语文").ToString Then
                    x = x + 1
                End If
            End If
        Next


        For i As Integer = 0 To dt.Rows.Count - 1
            Dim a = temp.Select("姓名='" + dt.Rows(i)("姓名") + "'")
            Dim index = temp.Rows.IndexOf(a(0))
            dt.Rows(i)("语文名次") = a(0).item("_pm")
        Next
pandingquan0502 2012-05-25
  • 打赏
  • 举报
回复
梦幻奇缘 14:57:21
排序之后第二种
table:
名字 分数 名次
A 100 1
B 100 1
C 90 3
D 90 3
E 80 5
F 80 5
G 70 7


有知道这个效果的做法吗????
暖枫无敌 2012-05-23
  • 打赏
  • 举报
回复
Select(筛选条件,排序条件)

dynamic a = temp.Select("姓名='" + dt.Rows[i]["姓名"] + "'","语文名次 desc,数学名次 desc,英语名次 desc");
AI观星台 2012-05-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

给你一个思路:
将原始的DataTable数据进行循环,每次循环的时候对各个成绩进行排序,写个排序算法,算出分数在排序中的索引就可以了,记的是升序排序啊
[/Quote]

是降序
caoqinghua 2012-05-23
  • 打赏
  • 举报
回复

//datatable 结构 如下
// 姓名 语文 数学 英语
// 张三 60 70 88
// 李四 70 60 67
// 王五 90 90 77
// 赵六 80 90 89

{
DataTable dt = new DataTable();

dt.Columns.Add("姓名");

dt.Columns.Add("语文", typeof(System.Int32));
dt.Columns.Add("数学", typeof(System.Int32));
dt.Columns.Add("英语", typeof(System.Int32));
dt.Columns.Add("语文名次", typeof(System.Int32));
dt.Columns.Add("数学名次", typeof(System.Int32));
dt.Columns.Add("英语名次", typeof(System.Int32));

DataRow row = null;

row = dt.NewRow();
row["姓名"] = "张三";
row["语文"] = "60";
row["数学"] = "70";
row["英语"] = "88";
dt.Rows.Add(row);

row = dt.NewRow();
row["姓名"] = "李四";
row["语文"] = "70";
row["数学"] = "60";
row["英语"] = "67";
dt.Rows.Add(row);

row = dt.NewRow();
row["姓名"] = "王五";
row["语文"] = "90";
row["数学"] = "90";
row["英语"] = "77";
dt.Rows.Add(row);

row = dt.NewRow();
row["姓名"] = "赵六";
row["语文"] = "80";
row["数学"] = "90";
row["英语"] = "89";
dt.Rows.Add(row);

DataTable temp = null;

DataView dv = null;

dv = dt.DefaultView;
dv.Sort = "语文 asc";

temp = dv.ToTable();
for (int i = 0; i <= dt.Rows.Count - 1; i++) {
DataRow[] a = temp.Select("姓名='" + dt.Rows[i]["姓名"] + "'");
int index = temp.Rows.IndexOf(a[0]);
dt.Rows[i]["语文名次"] = index + 1;
}

dv = dt.DefaultView;
dv.Sort = "数学 asc";

temp = dv.ToTable();
for (int i = 0; i <= dt.Rows.Count - 1; i++) {
DataRow[] a = temp.Select("姓名='" + dt.Rows[i]["姓名"] + "'");
int index = temp.Rows.IndexOf(a[0]);
dt.Rows[i]["数学名次"] = index + 1;
}


dv = dt.DefaultView;
dv.Sort = "英语 asc";

temp = dv.ToTable();
for (int i = 0; i <= dt.Rows.Count - 1; i++) {
DataRow[] a = temp.Select("姓名='" + dt.Rows[i]["姓名"] + "'");
int index = temp.Rows.IndexOf(a[0]);
dt.Rows[i]["英语名次"] = index + 1;
}


dv.Sort = "";

this.DataGridView1.DataSource = dt;
}
pandingquan0502 2012-05-23
  • 打赏
  • 举报
回复
dynamic 类型怎么引用呀??
caoqinghua 2012-05-22
  • 打赏
  • 举报
回复
呵呵,忘了这是c#版

//datatable 结构 如下
// 姓名 语文 数学 英语
// 张三 60 70 88
// 李四 70 60 67
// 王五 90 90 77
// 赵六 80 90 89

{
DataTable dt = new DataTable();

dt.Columns.Add("姓名");

dt.Columns.Add("语文", typeof(System.Int32));
dt.Columns.Add("数学", typeof(System.Int32));
dt.Columns.Add("英语", typeof(System.Int32));
dt.Columns.Add("语文名次", typeof(System.Int32));
dt.Columns.Add("数学名次", typeof(System.Int32));
dt.Columns.Add("英语名次", typeof(System.Int32));

DataRow row = null;

row = dt.NewRow();
row["姓名"] = "张三";
row["语文"] = "60";
row["数学"] = "70";
row["英语"] = "88";
dt.Rows.Add(row);

row = dt.NewRow();
row["姓名"] = "李四";
row["语文"] = "70";
row["数学"] = "60";
row["英语"] = "67";
dt.Rows.Add(row);

row = dt.NewRow();
row["姓名"] = "王五";
row["语文"] = "90";
row["数学"] = "90";
row["英语"] = "77";
dt.Rows.Add(row);

row = dt.NewRow();
row["姓名"] = "赵六";
row["语文"] = "80";
row["数学"] = "90";
row["英语"] = "89";
dt.Rows.Add(row);

DataTable temp = null;

DataView dv = null;

dv = dt.DefaultView;
dv.Sort = "语文 asc";

temp = dv.ToTable();
for (int i = 0; i <= dt.Rows.Count - 1; i++) {
dynamic a = temp.Select("姓名='" + dt.Rows[i]["姓名"] + "'");
dynamic index = temp.Rows.IndexOf(a(0));
dt.Rows[i]["语文名次"] = index + 1;
}

dv = dt.DefaultView;
dv.Sort = "数学 asc";

temp = dv.ToTable();
for (int i = 0; i <= dt.Rows.Count - 1; i++) {
dynamic a = temp.Select("姓名='" + dt.Rows[i]["姓名"] + "'");
dynamic index = temp.Rows.IndexOf(a(0));
dt.Rows[i]["数学名次"] = index + 1;
}


dv = dt.DefaultView;
dv.Sort = "英语 asc";

temp = dv.ToTable();
for (int i = 0; i <= dt.Rows.Count - 1; i++) {
dynamic a = temp.Select("姓名='" + dt.Rows[i]["姓名"] + "'");
dynamic index = temp.Rows.IndexOf(a(0));
dt.Rows[i]["英语名次"] = index + 1;
}


dv.Sort = "";

this.DataGridView1.DataSource = dt;
}

caoqinghua 2012-05-22
  • 打赏
  • 举报
回复
用的dataview和select处理了一下数据


'datatable 结构 如下
' 姓名 语文 数学 英语
' 张三 60 70 88
' 李四 70 60 67
' 王五 90 90 77
' 赵六 80 90 89
Dim dt As New DataTable

dt.Columns.Add("姓名")

dt.Columns.Add("语文", GetType(System.Int32))
dt.Columns.Add("数学", GetType(System.Int32))
dt.Columns.Add("英语", GetType(System.Int32))
dt.Columns.Add("语文名次", GetType(System.Int32))
dt.Columns.Add("数学名次", GetType(System.Int32))
dt.Columns.Add("英语名次", GetType(System.Int32))

Dim row As DataRow

row = dt.NewRow
row("姓名") = "张三"
row("语文") = "60"
row("数学") = "70"
row("英语") = "88"
dt.Rows.Add(row)

row = dt.NewRow
row("姓名") = "李四"
row("语文") = "70"
row("数学") = "60"
row("英语") = "67"
dt.Rows.Add(row)

row = dt.NewRow
row("姓名") = "王五"
row("语文") = "90"
row("数学") = "90"
row("英语") = "77"
dt.Rows.Add(row)

row = dt.NewRow
row("姓名") = "赵六"
row("语文") = "80"
row("数学") = "90"
row("英语") = "89"
dt.Rows.Add(row)

Dim temp As DataTable

Dim dv As DataView

dv = dt.DefaultView
dv.Sort = "语文 asc"

temp = dv.ToTable
For i As Integer = 0 To dt.Rows.Count - 1
Dim a = temp.Select("姓名='" + dt.Rows(i)("姓名") + "'")
Dim index = temp.Rows.IndexOf(a(0))
dt.Rows(i)("语文名次") = index + 1
Next

dv = dt.DefaultView
dv.Sort = "数学 asc"

temp = dv.ToTable
For i As Integer = 0 To dt.Rows.Count - 1
Dim a = temp.Select("姓名='" + dt.Rows(i)("姓名") + "'")
Dim index = temp.Rows.IndexOf(a(0))
dt.Rows(i)("数学名次") = index + 1
Next


dv = dt.DefaultView
dv.Sort = "英语 asc"

temp = dv.ToTable
For i As Integer = 0 To dt.Rows.Count - 1
Dim a = temp.Select("姓名='" + dt.Rows(i)("姓名") + "'")
Dim index = temp.Rows.IndexOf(a(0))
dt.Rows(i)("英语名次") = index + 1
Next


dv.Sort = ""

Me.DataGridView1.DataSource = dt

wangsong145 2012-05-22
  • 打赏
  • 举报
回复
给你一个思路:
将原始的DataTable数据进行循环,每次循环的时候对各个成绩进行排序,写个排序算法,算出分数在排序中的索引就可以了,记的是升序排序啊

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧