繁体   English   中英

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

[英]sorting a field of datatable which have special character

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

要做到这一点怎么办?

更新:为清楚起见,我添加了nore数据。 在实施建议的代码后获得的结果是:


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

您可以使用可枚举的功能对数据表进行排序。 这有点痛苦,但是您可以尝试下面的代码吗?

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范围。 该示例仅适用于xy和x格式的数据。

希望这可以帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM