我正在根据客户端浏览器发送的排序字段集合进行数据集的自定义过滤和排序,并使用Dynamic Linq来实现(大部分)所需的效果。我遇到问题的地方是当我尝试按String类型列进行排序时,它包含传统字符串和存储为字符串的数字。我似乎无法传递StringComparison枚举值,或者为Dynamic Linq orderby函数指定IComparer参数。
我的排序代码如下:
myList.AsQueryable().OrderBy("StringColWithNums ASC")
我最终得到了:
1
10
100
11
12
2
20
而不是:
1
2
10
11
12
20
100
任何人都有类似的经历吗?
答案 0 :(得分:1)
myList.AsQueryable().Sort((r, s) => int.Parse(r).CompareTo(int.Parse(s)));
如果这些是对象,只需使用int.Parse(r.StringColWithNums)
或任何字段,将进行一些调整。
哎呀,对不起,没看过所有OP看到它也有字母而你想要动态linq,编辑
修改强>
我不知道你是否能够使用Dynamic linq和传递IComparer来做到这一点。你可以在得到结果后做到这一点(也就是我最初编写的那种,经过修改)。评论你是否想追求那条线。
答案 1 :(得分:0)
尝试在字符串比较中执行数字比较时,这是一个基本问题。我会这样做的几种方式:
加载列表时,前缀数字的最大字符串大小为零,即String.Format("000000", number)
。这只有在你主要关心排序而不关心结果的外观时才有效 - 即使这样,你也可以将“000010”转换回数字并调用ToString()方法再次显示数字而不带前导零。 / p>
编写自己的OrderBy实现(扩展方法),其中传递一个函数(或匿名函数)作为参数,对调用传入方法的结果进行重新排序。
答案 2 :(得分: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());
这将为您提供所需的结果。如果没有,那么只需调整比较器。
答案 3 :(得分:0)
似乎这不是可以用Dynamic Linq开箱即用的东西,至少在.NET 2.0 / 3.5中是这样。我最终修改了Dynamic Linq源代码以完成我需要的工作。