我有一个datatable
,其中包含一些我从访问数据库中的表中填充的列。我拥有的一个特殊列是SN,其中包含如下数据:
SN
_____
-1
1.a
1.a
1.b
10
1000
1001
1002
11.a
11.b
13.a
2.a
2.b
2.c
2000
2001
21.a
22.b
3.a
3.b
3.c
4000
4001
4.a
SN字段是字符串格式,当我对数据进行排序时,结果如上所示 但我喜欢这里的是排序列,我希望是这样的:
SN
_____
-1
1.a
1.a
1.b
2.a
2.b
2.c
3.a
3.b
3.c
4.a
10
11.a
11.b
13.a
21.a
22.b
1000
1001
1002
2000
2001
4000
4001
可以做些什么来实现这个目标?
更新:为了清楚起见,我添加了数据。我在实现建议代码后获得的结果是:
SN
_____
-1
1.a
1.a
1.b
10
11.a
11.b
13.a
2.a
2.b
2.c
21.a
22.b
3.a
3.b
3.c
4.a
1000
1001
1002
2000
2001
4000
4001
答案 0 :(得分:1)
您可以使用可扩展功能对数据表进行排序。这有点痛苦,但你可以试试下面的代码吗?
DataTable myDataTable = new DataTable();
myDataTable.Columns.Add("SN", typeof(string));
//string myValues = "-1;1.a;1.b;10;1000;1001;1002;2.c;2.b;2.a;2000;2001;3.a;3.b;3.c;4000;4001;4.a;1.a";
string myValues = "a;a.b;c.c;-1;1.a;1.a;1.b;10;11.a;11.b;13.a;2.a;2.b;2.c;21.a;22.b;3.a;3.b;3.c;4.a;1000;1001;1002;2000;2001;4000;4001";
string[] myValuesArray = myValues.Split(';');
foreach (string myValue in myValuesArray)
{
DataRow myRow = myDataTable.NewRow();
myRow["SN"] = myValue;
myDataTable.Rows.Add(myRow);
}
string beforeSort = string.Join(";", myDataTable.AsEnumerable().Select(x => x["SN"]));
Console.WriteLine("Before Sorting:");
Console.WriteLine(beforeSort);
IEnumerable<DataRow> sortedValues = myDataTable.AsEnumerable()
.OrderBy(x =>
{
string currentStringValue = x["SN"].ToString();
string[] currentStringValueArray = currentStringValue.Split('.');
if (currentStringValueArray.Length == 2)
{
string currentPart = "";
int currentPartNumeric = 0;
if (int.TryParse(currentStringValueArray[0], out currentPartNumeric))
{
currentPart += currentPartNumeric.ToString();
}
else
{
//We are assuming our alphanumeric chars are integers
currentPart += (((int)(char.ToUpper(char.Parse(currentStringValueArray[0])))) - 64).ToString();
}
if (int.TryParse(currentStringValueArray[1], out currentPartNumeric))
{
currentPart += "." + currentPartNumeric.ToString();
}
else
{
//We are assuming our alphanumeric chars are integers
currentPart += "." + (((int)(char.ToUpper(char.Parse(currentStringValueArray[1])))) - 64).ToString();
}
return Convert.ToDecimal(currentPart, CultureInfo.InvariantCulture);
}
else if (currentStringValueArray.Length == 1)
{
int currentPartNumeric = 0;
string currentPart = "";
if (int.TryParse(currentStringValueArray[0], out currentPartNumeric))
{
currentPart += currentPartNumeric.ToString();
}
else
{
//We are assuming our alphanumeric chars are integers
currentPart += "." + (((int)(char.ToUpper(char.Parse(currentStringValueArray[0])))) - 64).ToString();
}
return Convert.ToDecimal(currentPart, CultureInfo.InvariantCulture);
}
else
return 0m;
});
string afterSort = string.Join(";", sortedValues.Select(x => x["SN"]));
Console.WriteLine("After Sorting:");
Console.WriteLine(afterSort);
//Copy to your existing datatable
myDataTable = sortedValues.CopyToDataTable();
PS:由于确保代码稳定性,我混合了您现有的数据
更新:这只是您的数据的一个示例,请记住,您应该根据您的数据多样性修改OrderBy范围。该示例仅适用于x.y和x格式的数据。
希望这有帮助