Сортировка коллекции числовых строк - PullRequest
7 голосов
/ 15 сентября 2010

Мне нужна возможность сортировать коллекцию клиентов, которая содержит свойство числовой строки.

Как можно отсортировать коллекцию ниже по коду в числовом порядке. Снова код является строкой.

           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; }
           }

Спасибо за любые предложения

Ответы [ 4 ]

17 голосов
/ 15 сентября 2010

Вариант 1: внедрить IComparer<Customer> и проанализировать код внутри этого

Вариант 2: использовать LINQ для того же:

customerList = customerList.OrderBy(c => int.Parse(c.Code)).ToList();

Вариант 3: изменить класс Customer таким образомчто числовое значение хранится в виде числового типа:)

РЕДАКТИРОВАТЬ: Как уже отмечалось, это вызовет исключение, если вы дадите ему клиента с нечисловым кодом.

Кроме того, яЯ звоню ToList(), потому что я предполагал, что вам все еще нужно, чтобы это был список.Если вам просто нужно перебрать результаты по порядку, то используйте:

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

Обратите внимание, что если вы перебираете это дважды, тем не менее, он также выполнит все разбор и сортировку дважды.

7 голосов
/ 15 сентября 2010

Если ключи всегда только цифры, а эти числа всегда могут быть преобразованы в целые числа, то это довольно просто.Просто конвертируйте их в целые числа.

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

Если какой-либо из них не является целым числом, это приведет к сбою.

Другой способ сделать это - дополнить строку начальными нулями:

var sorted = from customer in customerList orderby PadToTenDigits(customer.Code) select customer;

где PadToTenDigits - это метод, оставленный в качестве упражнения, который превращает «1» в «0000000001» и «1000» в «0000001000» и т. Д.

Если вам нужно сделатьистинная «числовая» сортировка по сложным кодам, где, скажем, код «A300-B» сортирует перед «A1000-XYZ», тогда у вас возникнут более сложные проблемы.Хитрость в том, чтобы разбить код на «части» и сделать стабильную сортировку для каждой части.В основном, сортировка по основанию.

3 голосов
/ 15 сентября 2010

Насколько вы уверены, что Код (а) числовой и (б) присутствует?

var sortedList = customerList.OrderBy(c => int.Parse(c.Code));

Если у вас есть сомнения, попробуйте другой подход

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);

Или уменьшитьколичество попыток для анализа значения и сохранения логики в одном делегате:

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

Примечание. Я использую int.MaxValue для перемещения нецелых входных данных в конец строки.Вы можете выбрать другое значение в зависимости от того, где вы хотите эти объекты.

0 голосов
/ 15 сентября 2010

Попробуйте LINQ to Objects:

var result = from c in customerList
             orderby Int.Parse(c.Code)
             select c;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...