【问题标题】:Sorting a DataTable, based on the ascii (or unicode) code of the characters根据字符的 ascii(或 unicode)代码对 DataTable 进行排序
【发布时间】:2011-12-18 14:06:56
【问题描述】:

我有一个数据表,其中包含字符串列中的数据。 价值观: “1” “{” “2”

当我从按列排序的 DataTable 中选择数据时,我希望得到如下值: “1” “2” “{”

但是,我得到的值是: “{” “1” “2”

如果我需要在 sql server 中执行此操作,我将使用排序规则“Latin1_general_bin”。 我在 DataTable 中需要同样的行为。

这是我的测试:

 [Test]
    public void TestDataTable()
    {
        var dt = new DataTable();
        dt.Columns.Add("a", typeof(string));
        dt.Rows.Add("1");
        dt.Rows.Add("{");
        dt.Rows.Add("2");
        int i = 0;
        foreach (var val in dt.Select("", "a"))
        {
            Assert.AreEqual(new string[] {"1", "2", "{"}[i++],val["a"]);
        }
    }

【问题讨论】:

    标签: c# sorting datatable dataset cultureinfo


    【解决方案1】:

    您可以将 DataTable 转换为 Enumerable,然后使用 OrderBy。然后使用 Enumerable.AsDataView().Table。

    可能有点多,但应该可以。

    干杯,Lior :)。

    【讨论】:

      【解决方案2】:

      此时我能想到的最佳解决方案是,使用反射设置私有字段 _compareFlags。 我知道,我讨厌反射,它可能会在某个未知的时间停止工作,但我有很多单元测试,所以我希望我不会为此后悔。

      欢迎任何更好的解决方案,我想创建自己的文化信息,但看不透(接受有关此路径的建议)。

      这是我对反射所做的:

       [Test]
          public void TestDataTable()
          {
              var dt = new DataTable();
              var f = typeof (DataTable).GetField("_compareFlags",
                                                  System.Reflection.BindingFlags.NonPublic |
                                                  System.Reflection.BindingFlags.Instance);
      
              var v = (System.Globalization.CompareOptions) f.GetValue(dt);
              f.SetValue(dt,  CompareOptions.OrdinalIgnoreCase);
      
      
      
              dt.Columns.Add("a", typeof(string));
              dt.Rows.Add("1");
              dt.Rows.Add("{");
              dt.Rows.Add("2");
              int i = 0;
              foreach (var val in dt.Select("", "a"))
              {
                  Assert.AreEqual(new string[] {"1", "2", "{"}[i++],val["a"]);
              }
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-11-25
        • 2017-11-25
        • 2021-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-09
        相关资源
        最近更新 更多