一个DataTable排序问题

tangjinzhou 2013-02-03 08:34:11
做一个值日安排软件时遇到一个问题,现有一个数据表
1 a
2 a
3 b
4 b
5 c

想要排序成(使abc之间的间隔行最大)
1 a
3 b
5 c
2 a
4 b

特来向各位大神求思路

...全文
589 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
md5e 2014-03-24
  • 打赏
  • 举报
回复
DataTable dt = new DataTable();
dt.Columns.Add("id", typeof(int));
dt.Columns.Add("value", typeof(string));
dt.Rows.Add(new object[] { 1, "a" });
dt.Rows.Add(new object[] { 2, "b" });
dt.Rows.Add(new object[] { 3, "a" });
dt.Rows.Add(new object[] { 4, "c" });
dt.Rows.Add(new object[] { 5, "b" });

DataTable dt2 = dt.Clone();
dt2.Columns.Add("rownum", typeof(int));

string _v = "---------";
int n=1;
foreach (DataRow row in dt.Select("", "value"))
{
if (_v != row["value"].ToString())
{
_v = row["value"].ToString();
n = 1;
}
else
{
n++;
}
dt2.Rows.Add(new object[] { row["id"], row["value"], n });

}

dt2.DefaultView.Sort = "rownum";
GridView1.DataSource = dt2;
GridView1.DataBind();

thewitcher~ 2014-03-24
  • 打赏
  • 举报
回复
你把DataTable转成泛型集合,再使用Linq罢。
信丰小飞鱼 2013-03-06
  • 打赏
  • 举报
回复
System.Linq排序 foreach(DataRow dr in DT.Row.Orderby(a=>a["Name"])) {}
  • 打赏
  • 举报
回复
dtCopy.Select("Name<>'" + dr["Name"] + "'", "ID")?还有这种用法?受教了。
double22822 2013-02-05
  • 打赏
  • 举报
回复
个人认为应该先得一个结果集:按姓名分组,组内按id排序。 然后把这个结果集按组内编号、组编号排序,这时候得到的结果集才是楼主要的。 代码地没有,不好意思啊!
tangjinzhou 2013-02-03
  • 打赏
  • 举报
回复
解决了 做个记号 哈哈哈
        //建立测试表
        DataTable dt = new DataTable();
        dt.Columns.Add("ID", typeof(int));
        dt.Columns.Add("Name", typeof(string));

        dt.Rows.Add(new object[] { 1, "a" });
        dt.Rows.Add(new object[] { 2, "c" });
        dt.Rows.Add(new object[] { 3, "b" });
        dt.Rows.Add(new object[] { 4, "b" });
        dt.Rows.Add(new object[] { 5, "c" });
        dt.Rows.Add(new object[] { 6, "c" });

        //排序Name
        DataTable dtCopy = dt.Copy();
        DataView dv = dt.DefaultView;
        dv.Sort = "Name";
        dtCopy = dv.ToTable();
        //核心逻辑
        DataTable newdt=dt.Clone();
        foreach (DataRow dr in dt.Rows)
        {
            DataRow[] rows = dtCopy.Select("Name<>'" + dr["Name"] + "'", "ID");
            if (rows != null) {
                newdt.Rows.Add(rows[0]);
            }
        }
tangjinzhou 2013-02-03
  • 打赏
  • 举报
回复
楼上这位是SQL大师呀,不过我个人觉得SQL写的代码可读性较差,而且效率上容易出现问题,一般我都是只进行数据读取操作,业务逻辑都是通过程序来完成
tangjinzhou 2013-02-03
  • 打赏
  • 举报
回复
忘了说了 这个不是SQL 是C#中的DataTable DataTable dt = new DataTable(); dt.Columns.Add("ID"); dt.Columns.Add("Name"); DataRow dr= dt.NewRow(); dr["ID"] = 1; dr["Name"] = "a"; dt.Rows.Add(dr);.....
  • 打赏
  • 举报
回复
with tb(id,[name])
as(
select 1,'a' union all
select 2,'a' union all
select 3,'b' union all
select 4,'b' union all
select 5,'c'
),
cte as(
select row=row_number()over(partition by [name] order by id),* from tb
)
select id,[name] from cte order by row,id

13,190

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 分析与设计
社区管理员
  • 分析与设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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