排序DataTable由整数和字符串组成

时间:2017-10-19 09:27:52

标签: c# string sorting datatable

我有一个DataTable,其列CourseNr的字符串类型为以下值:

"121"
"111"
"108"
"122"
"BH20"
"PHD45"
"ADH90"

我想按照以下方式对CourseNr列(ASC顺序中的整数)和(按字母顺序排列的ASC中的字符)进行排序:

"108"
"111"
"121"
"122"
"ADH90"
"BH20"
"PHD45"

我知道可以有很多可能的建议来解决这个问题,但我需要一些最好的方法来实现这个目标吗?

1 个答案:

答案 0 :(得分:1)

您可以使用windows-builtin自然排序(如f.e.文件已订购)StrCmpLogicalW

  

比较两个Unicode字符串。字符串中的数字被视为数字内容而不是   文本。此测试不区分大小写。

[SuppressUnmanagedCodeSecurity]
internal static class SafeNativeMethods
{
    [DllImport("shlwapi.dll", CharSet = CharSet.Unicode)]
    public static extern int StrCmpLogicalW(string psz1, string psz2);
}

public sealed class NaturalStringComparer : IComparer<string>
{
    public int Compare(string a, string b)
    {
        return SafeNativeMethods.StrCmpLogicalW(a, b);
    }
}

然后使用LINQ:

轻松地对DataTable进行排序的代码
table = table.AsEnumerable()
  .OrderBy(r => r.Field<string>("CourseNr"), new NaturalStringComparer())
  .CopyToDataTable();

NaturalStringComparer的积分:https://stackoverflow.com/a/248613/284240