求Table中多列的排序算法问题(要求简单速度快)

lcddjyy 2008-03-14 04:08:13
public DataTable Sort(DataTable table,string table_field)
{
//方法
retrun table
}

说明:table 中的列名和数据为:

(a.b)A,(x.y)B,(x.c)C,(b.y)D,(c.x)F,......
1 , 2 , 3 , 4 , 5 ......
table_field 为 :"F,C,D"


要调用该方法后 table 中的列名和数据如下
(c.x)F,(x.c)C,(b.y)D,(a.b)A,(x.y)B
5 , 3 , 4 , 1 , 2 ......
...全文
190 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
lcddjyy 2008-03-16
  • 打赏
  • 举报
回复
public DataTable TableSort(DataTable table, string table_field)
{
List<string> alreadyAdd = new List<string>();
List<string> AllColName = new List<string>();

string SortString = string.Empty;

//结构
DataTable resultTable = new DataTable();
string[] sortList = table_field.Split(',');
foreach (string strf in sortList)
{
foreach (DataColumn tmcol in table.Columns)
{
string oldcolname = tmcol.ColumnName.Trim();
//string lastchar = oldcolname.Substring(oldcolname.Length - 1, 1);
string lastchar = oldcolname.Substring(oldcolname.IndexOf(")")+1);
if (lastchar == strf.Trim())
{
//resultTable.Columns.Add(tmcol);
resultTable.Columns.Add(oldcolname);
alreadyAdd.Add(oldcolname);
SortString += oldcolname + " asc,";
break;
}
}
}

foreach (DataColumn tmcol in table.Columns)
{
string oldcolname = tmcol.ColumnName.Trim();
AllColName.Add(oldcolname);
if (alreadyAdd.IndexOf(oldcolname) < 0)
{
//resultTable.Columns.Add(tmcol);
resultTable.Columns.Add(oldcolname);
}
}

//数据
foreach (DataRow tmdr in table.Rows)
{
DataRow addrow = resultTable.NewRow();

foreach (string tmcol in AllColName)
{
addrow[tmcol] = tmdr[tmcol];
}

resultTable.Rows.Add(addrow);
}

//排序
if (SortString.Length > 0)
{
resultTable.DefaultView.Sort = SortString.Remove(SortString.Length - 1, 1);
}

return resultTable;
}
lcddjyy 2008-03-16
  • 打赏
  • 举报
回复
测试结果如下

shiling_02404 只是替换了数据,并没有替换列的名称。有的行数据还丢失了。

yuanmanguo 我简单修改了一下,代码是可以用的。
lcddjyy 2008-03-15
  • 打赏
  • 举报
回复
谢谢大家的参与,我周一测试一下,尽快结贴!
shiling_02404 2008-03-14
  • 打赏
  • 举报
回复
上面最后还少写了一个
}

你试一下你的数据
shiling_02404 2008-03-14
  • 打赏
  • 举报
回复
呵呵。既然你说是我的这个意思,那我就写了下。在我机子上数据量不大的情况下测试了,还可以。
C#代码:

private DataTable Sort(DataTable table,string table_field)
{

string[] strField;
strField=table_field.Split(',');
ArrayList alCol=new ArrayList();
//找到table中列名是strField中字段的列的序号
for(int i=0;i<strField.Length;i++)
{
for(int j=0;j<table.Columns.Count;j++)
{
if(strField[i]==table.Columns[j].ColumnName.ToString())
{
alCol.Add(j);//存储了table中对应field字段的列序号
break;
}
}
}
//准备交换
DataTable dtAfterChange=table.Copy();
for(int i=0;i<strField.Length;i++)
{
//序号不相等的才交换
if(Convert.ToInt32(alCol[i])!=i)
{
int t=Convert.ToInt32(alCol[i]);//把得到的对应传入field字段在原表中的序号赋给t
for(int j=0;j<table.Rows.Count;j++)
{
string strTemp=table.Rows[j][t].ToString().Trim();
dtAfterChange.Rows[j][i]=strTemp;
}
}
}
return dtAfterChange;
yuanmanguo 2008-03-14
  • 打赏
  • 举报
回复

赶着下班,没来的急测试!
你可以试一下.


public DataTable TableSort(DataTable table, string table_field)
{
List<string> alreadyAdd = new List<string>();
List<string> AllColName = new List<string>();

string SortString = string.Empty;

//结构
DataTable resultTable = new DataTable();
string[] sortList = table_field.Split(',');
foreach (string strf in sortList)
{
foreach (DataColumn tmcol in table.Columns)
{
string oldcolname = tmcol.ColumnName.Trim();
string lastchar = oldcolname.Substring(oldcolname.Length - 1, 1);
if (lastchar == strf.Trim())
{
resultTable.Columns.Add(tmcol);
alreadyAdd.Add(oldcolname);
SortString += oldcolname + " asc,";
}
}
}

foreach (DataColumn tmcol in table.Columns)
{
string oldcolname = tmcol.ColumnName.Trim();
AllColName.Add(oldcolname);
if (alreadyAdd.IndexOf(oldcolname) < 0)
{
resultTable.Columns.Add(tmcol);
}
}

//数据
foreach (DataRow tmdr in table.Rows)
{
DataRow addrow = resultTable.NewRow();

foreach(string tmcol in AllColName)
{
addrow[tmcol] = tmdr[tmcol];
}

resultTable.Rows.Add(addrow);
}

//排序
if (SortString.Length > 0)
{
resultTable.DefaultView.Sort = SortString.Remove(SortString.Length - 1, 1);
}

return resultTable;
}


lcddjyy 2008-03-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 shiling_02404 的回复:]
楼主的意思好像不是排序吧。
是通过传入的table_field对table各列进行重新“整理”,类似使得在显示时能按照传入的变量使对应列放在前面,放在后面的问题吧。
不知道楼主是不是这个意思?
[/Quote]

是这个问题的,不知道你有没有好的办法!我已经实现了,只是速度太慢了(循环是一层套一层,慢)
大宇_ 2008-03-14
  • 打赏
  • 举报
回复
table.DefaultView.Sort;不定只定列的顺序吧,写SQL时候把排序写好了不就可以了
shiling_02404 2008-03-14
  • 打赏
  • 举报
回复
楼主的意思好像不是排序吧。
是通过传入的table_field对table各列进行重新“整理”,类似使得在显示时能按照传入的变量使对应列放在前面,放在后面的问题吧。
不知道楼主是不是这个意思?
sadan2121 2008-03-14
  • 打赏
  • 举报
回复
迷糊
journeydj 2008-03-14
  • 打赏
  • 举报
回复
不能再简单了
journeydj 2008-03-14
  • 打赏
  • 举报
回复
table.DefaultView.Sort="A asc,B asc,C asc";
lcddjyy 2008-03-14
  • 打赏
  • 举报
回复
再简单的说一下
列名 (x)A,(a)B,(g)C...
数据 1,2,3...

参数 table_field:"C,B"

结果
列名 (g)C,(a)B,(x)A...
数据 3,2,1...

110,534

社区成员

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

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

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