2

我正在根据从客户端浏览器发送的排序字段集合对数据集进行一些自定义过滤和排序,并且正在使用 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

任何人都有做类似事情的经验吗?

4

4 回答 4

1
myList.AsQueryable().Sort((r, s) => int.Parse(r).CompareTo(int.Parse(s)));

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

哎呀,对不起,没有阅读所有的 OP 看它也有字母,你想要动态 linq,编辑

编辑

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

于 2010-12-06T18:30:26.847 回答
0

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

 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());

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

于 2010-12-07T06:11:06.307 回答
0

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

于 2010-12-08T04:10:40.563 回答
0

这是尝试在字符串比较中执行数字比较的一个基本问题。我会这样做的几种方法:

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

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

于 2010-12-06T19:26:57.303 回答