使用C#按多列对数据表进行排序

10

我有一个Datatable,其中的列名为foldernamedocumentname。数据如下:

FolderName  DocumentName
Folder1     HR[D] Document
Folder1     ___----'
Folder1     Asp_example.pdf
Folder2     SD
Folder3     Heavy_weight
Folder3     Accesorial Services

如何在.Net Framework 2.0中根据文件夹名称对文档名称进行字母排序。

我们尝试的解决方法如下,但由于包含超过1200000条记录,所以时间太长。

int counter=0;

while (counter < searchDT.Rows.Count){
   string FolderName = Convert.ToString(searchDT.Rows[counter]["Folder Name"]);

   string exp = "[Folder Name] like '" + FolderName + "'";

   if (FolderName.Contains("%") || FolderName.Contains("_") || FolderName.Contains("[]") ||      FolderName.Contains("'"))

      exp = "[Folder Name] like '" + EscapeLikeValue(FolderName) + "'";

   string sortExpression = "[Document Name] ASC";

   DataRow[] drfoldername = searchDT.Select(exp, sortExpression);

   foreach (DataRow row in drfoldername)
     drfoldernameDT.ImportRow(row);

   counter += drfoldername.Length;

 }

1
你提到这些信息是从数据库获取的,为什么不在SQL查询中使用ORDER BY子句呢?否则,你尝试过使用DataView而不是DataTable吗? - Jeremy Thompson
5个回答

42
DataTable dt = new DataTable();

DataView dv = new DataView(dt);
dv.Sort = "FolderName, DocumentName ASC";

试试这个。它将首先按FolderName,然后按DocumentName排序。

如果您需要将其发送到屏幕上的组件,则可以像使用DataTable一样执行相同的操作。


非常感谢,它起作用了。对于一行简单的代码,我写了一堆愚蠢的代码。 - user1931665
1
不要忘记点赞并标记为正确答案。这会激励我们提供更多的帮助。 - André Silva
这个回答对于楼主很有用,但是还没有标记为答案。 - Neel
1
是的,当这种情况发生时,我会感到有点难过,但至少我知道它对 OP 有所帮助。 - André Silva
1
@AndréSilva,你的解决方案只对那些字符串类型的列进行排序,假设我有一列名为colA的列,它具有像1.23、11.34和2.34这样的字符串值。那么它将会按照1.23, 11.34, 2.34的顺序排序,这是错误的。 - user6102644
@PranayDeep SaQiB在另一篇帖子中回答了这个问题。基本上,您需要复制DataTable并将您拥有的列更改为所需类型以进行排序。请查看他的答案:https://dev59.com/JlvUa4cB1Zd3GeqPv7Bt - André Silva

3

这是我解决这个问题的方法:

Datatable FI = new Datatable();
DataView viewFI = new DataView(FI);
viewFI.Sort = "ServiceDate, ServiceRoute";
DataTable OFI= viewFI.ToTable();

谢谢 - 这是唯一一个对我有用的答案。关键在于拥有 DataTable OFI = viewFI.ToTable();,这是大多数其他答案省略的。 - Greg Trevellick

2

你尝试过使用DataView.Sort吗?

dt.DefaultView.RowFilter = "FolderName , DocumentName ASC";
dt = dt.DefaultView.ToTable();

0

0

你可以使用

oDataSet.Tables[0].DefaultView.Sort = "Column1 ASC ";

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接