对具有特殊字符的数据表字段进行排序

时间:2016-03-16 10:36:09

标签: c# sorting datatables

我有一个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

1 个答案:

答案 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格式的数据。

希望这有帮助