Сортировка DataTable на основе ascii (или unicode) кода символов - PullRequest
0 голосов
/ 31 октября 2011

У меня есть DataTable с данными в столбце строки. Ценности: "1" "{" "2"

Когда я выбираю данные из сортировки DataTable по столбцу, я хотел бы получить значения как: "1" "2" "{"

но вместо этого я получаю значения как: "{" "1" "2"

Если бы мне нужно было сделать это на сервере SQL, я бы использовал сопоставление "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 голосов
/ 31 октября 2011

Лучшее решение, которое я могу придумать в это время, это установить закрытое поле _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"]);
        }
    }
0 голосов
/ 31 октября 2011

Вы можете превратить DataTable в Enumerable, а затем использовать OrderBy. Затем используйте Enumerable.AsDataView (). Table.

Может быть немного, но это должно сработать.

Ура, Лиор:).

...