对数字字符串的集合进行排序

use*_*969 7 .net c# sorting

我需要能够对包含数字字符串属性的客户集合进行排序.

如何按数字顺序按代码对下面的集合进行排序.再次Code是一个字符串.

           class Program
           {
              static void Main(string[] args)
              {
                 SortableObservableCollection<Customer> customerList = new SortableObservableCollection<Customer>();
                 customerList.Add(new Customer() {Name = "Jo", Code = "1"});
                 customerList.Add(new Customer() { Name = "Jo", Code = "10" });
                 customerList.Add(new Customer() { Name = "Jo", Code = "11" });
                 customerList.Add(new Customer() { Name = "Jo", Code = "9" });
                 customerList.Add(new Customer() { Name = "Jo", Code = "7" });
                 customerList.Add(new Customer() { Name = "Jo", Code = "12" });
                 customerList.Add(new Customer() { Name = "Jo", Code = "13" });
                 customerList.Add(new Customer() { Name = "Jo", Code = "2" });
                 customerList.Add(new Customer() { Name = "Jo", Code = "5" });
                 customerList.Add(new Customer() { Name = "Jo", Code = "7" });

                 //Order them by Code How
              }
           }

           public class Customer
           {
              public string Name { get; set; }
              public string Code { get; set; }
           }
Run Code Online (Sandbox Code Playgroud)

谢谢你的任何建议

Jon*_*eet 17

选项1:在其中实施IComparer<Customer>和解析代码

选项2:使用LINQ做同样的事情:

customerList = customerList.OrderBy(c => int.Parse(c.Code)).ToList();
Run Code Online (Sandbox Code Playgroud)

选项3:更改Customer类,以便将数值存储为数字类型:)

编辑:如上所述,如果您给客户提供非数字代码,这将抛出异常.

此外,我正在打电话,ToList()因为我认为你仍然需要它作为一个列表.如果您只需按顺序迭代结果,则使用:

IEnumerable<Customer> ordered = customerList.OrderBy(c => int.Parse(c.Code));
Run Code Online (Sandbox Code Playgroud)

请注意,如果迭代两次,它将执行所有解析和排序两次.


Ant*_*ram 7

您对本准则 (a) 是数字的且 (b) 存在的信心有多大?

var sortedList = customerList.OrderBy(c => int.Parse(c.Code));
Run Code Online (Sandbox Code Playgroud)

如果您有疑问,请尝试其他方法

Func<string, bool> isInteger = s => { int temp; return int.TryParse(s, out temp); };
var query = customerList.OrderBy(c => isInteger(c.Code) ? int.Parse(c.Code) : int.MaxValue);
Run Code Online (Sandbox Code Playgroud)

或者减少解析该值的尝试次数并将逻辑保留在一个委托中:

Func<string, int> intParser = input =>
{
    int result;
    if (!int.TryParse(input, out result))
        return int.MaxValue; 

    return result;
};

var query = customerList.OrderBy(c => intParser(c.Code)); // .ToList() if you wish
Run Code Online (Sandbox Code Playgroud)

注意:我使用 int.MaxValue 将非整数输入移动到该行的后面。您可以根据您可能需要这些对象的位置来选择另一个值。


Eri*_*ert 7

如果键总是只是数字而且这些数字总是可以转换为int,那么它非常简单.只需将它们转换为整数即可.

var sorted = from customer in customerList orderby Int32.ParseInt(customer.Code) select customer;
Run Code Online (Sandbox Code Playgroud)

如果它们中的任何一个不是整数,那么这将崩溃.

另一种方法是用前导零填充字符串:

var sorted = from customer in customerList orderby PadToTenDigits(customer.Code) select customer;
Run Code Online (Sandbox Code Playgroud)

其中PadToTenDigits是一个留作练习的方法,将"1"变为"0000000001",将"1000"变为"0000001000",依此类推.

如果你必须对复杂代码进行真正的"数字"排序,例如,代码"A300-B"在"A1000-XYZ"之前排序,那么你手上就会遇到更难的问题.诀窍是将代码分解为"部分"并对每个部分进行稳定的排序.基本上,基数排序.