【问题标题】:sorting a field of datatable which have special character对具有特殊字符的数据表字段进行排序
【发布时间】:2016-03-16 10:36:08
【问题描述】:

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

【问题讨论】:

    标签: c# sorting datatables


    【解决方案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 格式的数据。

    希望对你有帮助

    【讨论】:

    • 虽然你的代码很棒,但它并没有按预期工作。上图只是数据表的一些示例。应用您的代码后的结果是:-1, 1.a, 1.b, 11.a,12.a, 13.a, 2.a, 2.b and so on
    • @Skaranjit 所以我得到它并更新了我的答案你能检查一下吗?
    猜你喜欢
    • 2012-05-25
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 2014-01-22
    • 2020-11-13
    • 2015-02-08
    • 1970-01-01
    • 2016-11-18
    相关资源
    最近更新 更多