簡體   English   中英

根據字符的ascii(或unicode)代碼對DataTable進行排序

[英]Sorting a DataTable, based on the ascii (or unicode) code of the characters

我有一個在字符串列中包含數據的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"]);
        }
    }

您可以將DataTable變成Enumerable,然后使用OrderBy。 然后使用Enumerable.AsDataView()。Table。

可能很多,但是應該可以。

干杯,騙子:)。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM