根据字符的ascii(或unicode)代码对DataTable进行排序

本文关键字:代码 DataTable 排序 unicode 字符 ascii | 更新日期: 2023-09-27 18:12:45

我有一个数据表,数据在字符串列。价值观:"1"{"2"

当我从数据表排序的列中选择数据时,我希望得到的值为:"1"2"{"

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

如果我需要在sql server中这样做,我会使用collation"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"]);
        }
    }

根据字符的ascii(或unicode)代码对DataTable进行排序

此时我能想到的最佳解决方案是,使用反射设置私有字段_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"]);
        }
    }

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

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

干杯,Lior:).