C# 如何将(1,11,12,2,All,Others)排序为(All,1,2,11,12,Others)?
C# 如何将(1,11,12,2,All,Others)排序为(All,1,2,11,12,Others)?,c#,sorting,C#,Sorting,我有一个组合框来显示我数据库中的数据(varchar)。当我显示数据时,数据总是“1,2,3,4,其他”,其排序如下: 1 10 11 12 2 3 4 All Others 如何使下拉列表看起来像: All 1 2 3 4 10 11 12 Others 或 在SQL中,我尝试按CAST排序(priorityNum作为无符号整数),然后将All和Other添加到数据表结果中。但是如何将All和Others设置为始终是第一位和最后一位呢?将其存储为varchar有什么原因吗?它应该是一个in
我有一个组合框来显示我数据库中的数据(varchar)。当我显示数据时,数据总是“1,2,3,4,其他”,其排序如下:
1
10
11
12
2
3
4
All
Others
如何使下拉列表看起来像:
All
1
2
3
4
10
11
12
Others
或
在SQL中,我尝试按CAST排序(priorityNum作为无符号整数),然后将
All
和Other
添加到数据表结果中。但是如何将All
和Others
设置为始终是第一位和最后一位呢?将其存储为varchar有什么原因吗?它应该是一个int,这将解决您的问题-并且是正确的存储类型是否有将其存储为varchar的原因?它应该是一个int,这将解决您的问题-并且是正确的存储类型您需要一些特殊的比较方法。它应该检查两个字符串是否都是数字,然后使用它们的数值进行比较。如果第一个值为All或Others,第二个值为number,则第一个值较小。如果第一个是全部,第二个是其他,则第一个较小。您需要一些特殊的比较方法。它应该检查两个字符串是否都是数字,然后使用它们的数值进行比较。如果第一个值为All或Others,第二个值为number,则第一个值较小。如果第一个是All,第二个是Others,那么第一个会更小。理想情况下,您可以使用类似List(T).Sort的东西
制作比较器时,检查值是否为int,如果是,则将其作为正常值进行比较,
如果不是,你知道这是你所有/其他案例之一。然后,根据正在处理的字符串返回一个值
也就是说,如果您可以将int放在数据库中,而不是放在All和其他中,然后在运行时将它们放在数据库中,这将使排序更加容易。理想情况下,您可以使用类似List(T).Sort的东西 制作比较器时,检查值是否为int,如果是,则将其作为正常值进行比较, 如果不是,你知道这是你所有/其他案例之一。然后,根据正在处理的字符串返回一个值 也就是说,如果你可以将整数放在数据库中,而不是放在All和Others中,然后在运行时将它们放在数据库中,那么排序就会容易得多。你应该将数字与文本分开处理(排序),然后重新构建列表。或将所有不可排序的项目存储在单独的字典中,例如:
All -> 0
Other -> int.MaxVallue
然后遍历未排序的列表,将非数字项(通过dictionary或Int.TryParse)与数字分开,对列表中的数字进行排序,然后插入dictionary中的文本项
听起来很复杂,但准备更改那些非数字项 您应该将数字与文本分开处理(排序),然后重新构建列表。或将所有不可排序的项目存储在单独的字典中,例如:
All -> 0
Other -> int.MaxVallue
然后遍历未排序的列表,将非数字项(通过dictionary或Int.TryParse)与数字分开,对列表中的数字进行排序,然后插入dictionary中的文本项
听起来很复杂,但准备更改那些非数字项 只要集合是一个
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);
}
}
class myStringComparer:IComparer{
公共整数比较(字符串a、字符串b){
如果(a==b)返回0;
如果(a==“All”| | b==“Others”)返回-1;
如果(a==“其他”| b==“所有”)返回1;
返回int.Parse(a)-int.Parse(b);
}
}
这样,如果发现意外数据(除“All”、“Others”或数字以外的任何数据),就会抛出异常。在尝试整数解析之前,可能需要添加其他逻辑
现在,您可以在列表/集合中调用
.OrderBy(new myStringComparer())
。请注意,OrderBy
仅对IEnumerable
对象可用(这包括可以放在foreach
循环上的任何内容,例如数组、列表等)。只要集合是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);
}
}
class myStringComparer:IComparer{
公共整数比较(字符串a、字符串b){
如果(a==b)返回0;
如果(a==“All”| | b==“Others”)返回-1;
如果(a==“其他”| b==“所有”)返回1;
返回int.Parse(a)-int.Parse(b);
}
}
这样,如果发现意外数据(除“All”、“Others”或数字以外的任何数据),就会抛出异常。在尝试整数解析之前,可能需要添加其他逻辑
现在,您可以在列表/集合中调用
.OrderBy(new myStringComparer())
。请注意,OrderBy
仅适用于IEnumerable
对象(这包括可以放在foreach
循环上的任何东西,如数组、列表等)。第一手,按长度排序,然后按值排序,这将解决11排在2之前的问题
对于你的两个特殊单词,你需要一些魔力。第一手,按长度排序,然后按值排序,这将解决你的问题,11排在2之前
对于您的两个特殊单词,您将需要一些魔力。我通过使用CAST at SQL Comment解决了这个问题,并以编程方式将“All”和“Others”添加到我的数据表中。我通过使用CAST at SQL Comment解决了这个问题,并以编程方式将“All”和“Others”添加到我的数据表中。显示一些代码。告诉我们你在用什么语言。问题是C#显示一些代码。告诉我们您使用的是哪种语言。问题标记为C#,但这需要使用两个特殊整数来表示All和Others值,或者(我更喜欢)s