转换为十进制并执行OrderBy

时间:2015-12-08 10:57:42

标签: c# linq datatable

我的数据表包含所有字符串列,但在某些列中我们填充数值。当我在该数字列的数据表上执行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");
    }
}

3 个答案:

答案 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)

您只需将包含stringint的{​​{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