我有一个组合框来显示我的数据库中的数据(varchar)。数据总是“1,2,3,4,其他”,当我显示数据时,它就像这样:
1
10
11
12
2
3
4
All
Others
如何使下拉列表看起来像:
All
1
2
3
4
10
11
12
Others
OR
在SQL中,我尝试ORDER BY CAST(priorityNum AS UNSIGNED INTEGER)
之后将All
和Other
添加到我的数据表结果中。但是如何设置All
和Others
始终是第一个和最后一个?
答案 0 :(得分:6)
只要您的收藏集是IEnumerable
,您就可以使用自定义比较器方法调用OrderBy
。
你的比较器看起来像这样:
class myStringComparer: IComparer<string> {
public int Compare(string a, string b) {
if (a == b) return 0;
if (a == "All" || b == "Others") return -1;
if (a == "Others" || b == "All") return 1;
return int.Parse(a) - int.Parse(b);
}
}
如果发现意外数据(除了“全部”,“其他”或数字之外的任何其他内容),这将只会抛出异常。您可能希望在尝试整数解析之前添加其他逻辑。
现在,您可以在列表/集合上调用.OrderBy(new myStringComparer())
。请注意,OrderBy
仅适用于IEnumerable
个对象(这包括您可以放在foreach
循环上的任何内容,例如数组,列表等。)
答案 1 :(得分:1)
有没有理由将它存储为varchar?它应该是一个int,这将解决您的问题 - 并且是您存储的正确类型
答案 2 :(得分:1)
理想情况下,你可以使用像List(T).Sort这样的东西 http://msdn.microsoft.com/en-us/library/w56d4y5z.aspx#Y851
当您进行比较时,检查该值是否为int,如果是,则将其正常比较, 如果没有,你知道它的全部/其他情况之一。然后根据您正在处理的字符串返回一个值。
也就是说,如果你可以把数据放入数据库而不是放入All和Others,然后在运行时将它们放入,那么它将使排序变得更加容易。
答案 3 :(得分:0)
你需要一些特殊的比较方法。它应检查两个字符串是否为数字,然后使用它们的数值进行比较。如果第一个值为All或Others,第二个值为number,则第一个值较小。如果第一个是全部而第二个是其他,则第一个是较小的。
答案 4 :(得分:0)
您应该从文本中单独处理(排序)数字,然后重新构建列表。或者将所有不可分类的项目存储在单独的字典中,例如:
All -> 0
Other -> int.MaxVallue
比你走未排序的列表,从数字中分离非数字项(通过字典或Int.TryParse),对列表中的数字进行排序,然后插入字典中的文本项。
听起来很复杂,但准备更改那些非数字项目。
答案 5 :(得分:0)
第一手,按长度排序,然后按值排序,这将解决您在11之前的问题。
对于你的两个特殊词,你需要一些魔力。
答案 6 :(得分:0)
我在SQL Comment中使用CAST解决了这个问题,并以编程方式将“All”和“Others”添加到我的数据表中。