我有一个DataTable
,其列CourseNr
的字符串类型为以下值:
"121"
"111"
"108"
"122"
"BH20"
"PHD45"
"ADH90"
我想按照以下方式对CourseNr列(ASC顺序中的整数)和(按字母顺序排列的ASC中的字符)进行排序:
"108"
"111"
"121"
"122"
"ADH90"
"BH20"
"PHD45"
我知道可以有很多可能的建议来解决这个问题,但我需要一些最好的方法来实现这个目标吗?
答案 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)