Естественная числовая сортировка в C # - PullRequest
3 голосов
/ 24 февраля 2012

У меня проблема при сортировке общего списка в C #

У меня есть List<MyObjects> myList, а MyObject имеет строковое свойство.

Теперь это выглядит так при сортировке по убыванию

2.4.88

2.4.70

2.4.164 -> это неправильно

2.4.15

Как мне отсортировать мой список?

Я пробовал:

myList.sort(delegate(MyObjects obj1, MyObjects obj2)
{
    return obj2.version.CompareTo(obj1.version);
});

Нельзя использовать Linq (более старый фреймворк)

ОБНОВЛЕНИЕ: Мой список также может содержать N / A

Ответы [ 6 ]

4 голосов
/ 24 февраля 2012

Вы не можете сравнивать как строки, потому что, очевидно, это правильная сортировка строк. Вам нужно проанализировать числа или экземпляр класса Version:

myList.sort(delegate(MyObjects obj1, MyObjects obj2)
{
    return new Version(obj2.version).CompareTo(new Version(obj1.version));
});
2 голосов
/ 24 февраля 2012

Я должен был сделать естественную сортировку некоторое время назад.Не помню, где я нашел код, но разместил его в своем блоге для дальнейшего использования: http://www.geekality.net/2009/03/02/natural-sorting

Вот код:

using System.Collections.Generic;
using System.IO;
using System.Runtime.InteropServices;
using System.Security;

namespace NaturalSort
{
     public sealed class NaturalStringComparer : IComparer<string>
     {
         private readonly int modifier = 1;

         public NaturalStringComparer(bool descending)
         {
             if (descending)
                 modifier = -1;
         }

         public NaturalStringComparer()
             :this(false) {}

         public int Compare(string a, string b)
         {
             return SafeNativeMethods.StrCmpLogicalW(a ?? "", b ?? "") * modifier;
         }
     }

     public sealed class NaturalFileInfoComparer : IComparer<FileInfo>
     {
         public int Compare(FileInfo a, FileInfo b)
         {
             return SafeNativeMethods.StrCmpLogicalW(a.Name ?? "", b.Name ?? "");
         }
     }

     [SuppressUnmanagedCodeSecurity]
     internal static class SafeNativeMethods
     {
         [DllImport("shlwapi.dll", CharSet = CharSet.Unicode)]
         public static extern int StrCmpLogicalW(string psz1, string psz2);
     }
}

Вы будете использовать его в этих строчках:

myList.Sort(new NaturalStringComparer(true));
2 голосов
/ 24 февраля 2012

Возможно сортировать по версии?

return (Version.Parse(obj2.version)).CompareTo(Version.Parse(obj1.version));

конечно, будет дешевле, если вы будете выполнять разбор только один раз (возможно, сделайте version a Version вместо string)

1 голос
/ 24 февраля 2012

Возможно, один из них может вам помочь:

1 голос
/ 24 февраля 2012

Если ваш шаблон строки соответствует классу версии .Net, преобразуйте его в объект Version и сравните .

0 голосов
/ 24 февраля 2012

Можете ли вы описать, как это неправильно.Похоже, он идеально расположен по порядку.Однако, просто случайное предложение, если вы уверены в формате, вы можете разбить строку и преобразовать в число для проверки такого рода вещей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...