【问题标题】:Dynamic Linq: How to specify the StringComparison type?Dynamic Linq:如何指定 StringComparison 类型?
【发布时间】:2010-12-08 12:10:40
【问题描述】:

我正在根据从客户端浏览器发送的排序字段集合对数据集进行一些自定义过滤和排序,并且正在使用 Dynamic Linq 来实现(大部分)预期效果。我遇到问题的地方是当我尝试按字符串类型的列进行排序时,该列包含传统字符串和存储为字符串的数字。看来我不能传入 StringComparison 枚举值,或为 Dynamic Linq orderby 函数指定 IComparer 参数。

我的排序代码如下:

myList.AsQueryable().OrderBy("StringColWithNums ASC")

我最终得到:

1
10
100
11
12
2
20

代替:

1
2
10
11
12
20
100

有没有人做过类似的事情?

【问题讨论】:

    标签: c# linq dynamic-linq


    【解决方案1】:
    myList.AsQueryable().Sort((r, s) => int.Parse(r).CompareTo(int.Parse(s)));
    

    如果这些是对象,则需要进行一些调整,只需使用 int.Parse(r.StringColWithNums) 或任何字段。

    糟糕,抱歉,没有阅读所有 OP 以看到它也有字母,而您想要动态 linq,正在编辑

    编辑

    我不知道您是否能够使用动态 linq 并传递 IComparer 来做到这一点。在得到结果后你也许可以这样做(即,正如我最初编写排序时所做的那样,经过修改)。如果你想追求那条线,请评论。

    【讨论】:

      【解决方案2】:

      这是尝试在字符串比较中执行数字比较的一个基本问题。有几种方法可以做到这一点:

      • 加载列表时,在数字前加上一定数量的零,以配合最大字符串大小,即String.Format("000000", number)。这仅在您主要关心排序而不关心结果的外观时才有效 - 即使这样,您也可以将“000010”转换回数字并调用 ToString() 方法以再次显示没有前导零的数字。

      • 编写您自己的 OrderBy 实现(扩展方法),其中您传递一个函数(或匿名函数)作为参数,以调用传入的方法对结果进行重新排序。

      【讨论】:

        【解决方案3】:

        你可以通过写一个新的字符串比较器来解决这个问题

         class AlphaNumericComparer : IComparer<string>
                {
                    public int Compare(string x, string y)
                    {
                        // if both values are integers then do int comparision
                        int xValue, yValue;
                        if (int.TryParse(x, out xValue) && int.TryParse(y, out yValue))
                            return xValue.CompareTo(yValue);
        
                        return x.CompareTo(y); // else do string comparison
                    }
                }
        

        然后您可以在 OrderBy 和 Sort 等方法中使用比较器

        var sorted = lst.OrderBy(s => s, new AlphaNumericComparer());
        
        lst.Sort(new AlphaNumericComparer());
        

        这将为您提供所需的结果。如果不是,那么只需调整比较器。

        【讨论】:

        • 我不认为你可以使用带有动态 linq 的字符串比较器,但我走了那条路,却没能成功。
        【解决方案4】:

        这似乎不是 Dynamic Linq 开箱即用的事情,至少在 .NET 2.0/3.5 中不能。我最终修改了 Dynamic Linq 源代码以完成我所需要的。

        【讨论】:

          猜你喜欢
          • 2021-07-22
          • 2019-09-21
          • 1970-01-01
          • 2020-05-19
          • 2021-04-30
          • 2018-12-14
          • 2021-12-02
          • 1970-01-01
          • 2011-03-07
          相关资源
          最近更新 更多