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

发布于 2024-12-13 01:02:41 字数 626 浏览 1 评论 0原文

我有一个数据表,其中的数据位于字符串列中。 价值观: “1” “{” “2”

当我从按列排序的数据表中选择数据时,我希望获得的值如下: “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"]);
        }
    }

I have a DataTable with data in a string column.
Values:
"1"
"{"
"2"

When I select data from the DataTable sorting by the column I would like to get the values as:
"1"
"2"
"{"

but instead, I get the values as:
"{"
"1"
"2"

If I needed to do it in sql server I would use the collation "Latin1_general_bin".
I need that same behavior in DataTable.

Here is my test:

 [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"]);
        }
    }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

愿得七秒忆 2024-12-20 01:02:41

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

The best solution I can come up with at this time is, setting the private field _compareFlags using reflection.
I know, I hate reflection for this, and it might stop working at some unknown time, but I have a lot of unit tests for it so I hope I will not live to regret this.

Any better solution is welcome, I thought of creating my own culture info, but couldn't see it through (open to suggestions on this path).

Here is what I did with reflection:

 [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"]);
        }
    }
狂之美人 2024-12-20 01:02:41

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

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

干杯,利奥尔:)。

You can turn the DataTable into an Enumerable and then use OrderBy. Then use Enumerable.AsDataView().Table.

Might be a bit much, but it should work.

Cheers, Lior :).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文