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

时间:2011-10-31 08:56:56

标签: c# sorting datatable dataset cultureinfo

我有一个DataTable,其中包含字符串列中的数据。 价值观: “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"]);
        }
    }

2 个答案:

答案 0 :(得分:0)

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

可能会有点多,但它应该有效。

干杯,Lior:)。

答案 1 :(得分:0)

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