一个DataTable排序问题
做一个值日安排软件时遇到一个问题,现有一个数据表1 a
2 a
3 b
4 b
5 c
想要排序成(使abc之间的间隔行最大)
1 a
3 b
5 c
2 a
4 b
特来向各位大神求思路
值日算法 c --------------------编程问答--------------------
with tb(id,[name])--------------------编程问答-------------------- 忘了说了 这个不是SQL 是C#中的DataTable
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
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);..... --------------------编程问答-------------------- 楼上这位是SQL大师呀,不过我个人觉得SQL写的代码可读性较差,而且效率上容易出现问题,一般我都是只进行数据读取操作,业务逻辑都是通过程序来完成 --------------------编程问答-------------------- 解决了 做个记号 哈哈哈
//建立测试表--------------------编程问答-------------------- 个人认为应该先得一个结果集:按姓名分组,组内按id排序。
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]);
}
}
然后把这个结果集按组内编号、组编号排序,这时候得到的结果集才是楼主要的。
代码地没有,不好意思啊! --------------------编程问答-------------------- dtCopy.Select("Name<>'" + dr["Name"] + "'", "ID")?还有这种用法?受教了。 --------------------编程问答-------------------- System.Linq排序
foreach(DataRow dr in DT.Row.Orderby(a=>a["Name"]))
{}
补充:.NET技术 , 分析与设计