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