我的数据表包含所有字符串列,但在某些列中,我们填充数值.当我在该数字列的数据表上执行orderby时,它没有正确排序.在订购我的桌子之前
Name Account Department
Kiran 1100 CSC
Subbu 900 CSC
Ram 500 CSC
Raj 800 CSC
Joy 400 CSC
Run Code Online (Sandbox Code Playgroud)
订购之后看起来像
Name Account Department
Kiran 1100 CSC
Joy 400 CSC
Ram 500 CSC
Raj 800 CSC
Subbu 900 CSC
Run Code Online (Sandbox Code Playgroud)
我的代码:
public DataTable sortData(string columnName)
{
DataTable dt1=new DataTable();
return dt1=dataMgr[DatabaseFileNames.ControlDatabase]["OrderedTableName"]
.Select("Department='CSC'")
.OrderBy(x=>!string.IsNullOrEmpty(x.Field<string>(columnName)))
.CopyToDataTable();
}
Run Code Online (Sandbox Code Playgroud)
我思考了这个问题很长一段时间,我想出的解决方案非常明显:本质上排序就是比较 - 那么我们为什么不写一个自定义的Comparer......
public class MyComparer : IComparer<string>
{
private readonly string _columnName;
public MyComparer(string columnName)
{
_columnName = columnName;
}
public int Compare(string leftValue, string rightValue)
{
double leftDouble, rightDouble;
switch (_columnName)
{
case "Account":
if (Double.TryParse(leftValue, out leftDouble) && Double.TryParse(rightValue, out rightDouble))
{
return leftDouble.CompareTo(rightDouble);
}
else
{
return String.Compare(leftValue, rightValue);
}
default:
return String.Compare(leftValue, rightValue);
}
}
}
Run Code Online (Sandbox Code Playgroud)
...然后只需将其添加到 OrderBy...
public DataTable sortData(string columnName)
{
DataTable dt1=new DataTable();
return dt1=dataMgr[DatabaseFileNames.ControlDatabase]["OrderedTableName"]
.Select("Department='CSC'")
.OrderBy(x => x.Field<string>(columnName) ?? String.Empty,
new MyComparer(columnName)
)
.CopyToDataTable();
}
Run Code Online (Sandbox Code Playgroud)
...我们已经完成了,甚至可以扩展该解决方案以使用其他数据类型,例如DateTime.
| 归档时间: |
|
| 查看次数: |
134 次 |
| 最近记录: |