我的数据表包含所有字符串列,但在某些列中我们填充数值。当我在该数字列的数据表上执行orderby时,它没有正确排序。在命令我的表看起来
之前Name Account Department
Kiran 1100 CSC
Joy 400 CSC
Ram 500 CSC
Raj 800 CSC
Subbu 900 CSC
订购后看起来像
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();
}
我的代码:
private void mouseClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
Trace.WriteLine("Mouse clicked");
}
}
答案 0 :(得分:3)
您的OrderBy
应该看起来像这样:
.OrderBy(x => double.Parse(x.Field<string>(columName)))
当然,假设您的所有值实际上都可以解析为double
。
如果您还需要将其用于非数字列,我认为您不得不根据列名进行区分。 (例如,您必须在 columnName 和IComparer
之间建立一些映射。)
这可能看起来像这样:
IComparer comparer = null;
// instead of a switch/case you could also have a Dictionary<string, IComparer> for example...
switch(columName)
{
case "Account": comparer = Comparer<double>.Default;
break;
default: comparer = Comparer<string>.Default;
break;
}
// so your OrderBy would look like this:
.OrderBy(x => x, comparer)
清洁解决方案肯定会为表中的列提供正确的数据类型。
答案 1 :(得分:2)
您只需将包含string
值int
的{{1}}与前导0
匹配,即可进行排序,以便正常使用:
.OrderBy(x => x.Field<string>(columnName)?.PadLeft(10, '0') ?? "0")
您必须将大小定义为足够大(10?)和null
的某个值,以便根据您的喜好对其进行排序(如果使用"0"
,它们将首先显示)。
答案 2 :(得分:1)
我想了很长一段时间,我提出的解决方案非常明显:基本上订购都是关于比较的 - 所以为什么我们不写自定义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);
}
}
}
...然后只需将其添加到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();
}
...我们已经完成,甚至可以扩展该解决方案以使用其他数据类型,例如DateTime
。