Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 根据字符的ascii(或unicode)代码对数据表进行排序_C#_Sorting_Datatable_Dataset_Cultureinfo - Fatal编程技术网

C# 根据字符的ascii(或unicode)代码对数据表进行排序

C# 根据字符的ascii(或unicode)代码对数据表进行排序,c#,sorting,datatable,dataset,cultureinfo,C#,Sorting,Datatable,Dataset,Cultureinfo,我有一个数据表,数据在一个字符串列中。 价值观: "1" "{" “2” 当我从按列排序的DataTable中选择数据时,我希望得到如下值: "1" "2" “{” 但是,我得到的值是: "{" "1" “2” 如果我需要在sql server中执行此操作,我将使用排序规则“Latin1\u general\u bin”。 我需要DataTable中的相同行为 这是我的测试: [Test] public void TestDataTable() { var dt

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

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

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

如果我需要在sql server中执行此操作,我将使用排序规则“Latin1\u general\u 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"]);
        }
    }

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

可能有点多,但应该行得通


干杯,Lior:)。

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