2012-02-24 3 views
3

У меня есть проблема при сортировке общего списка в C#Естественная числовая сортировки в 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 (старше рамочный)

UPDATE: Мой список может также содержит N/A

ответ

4

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

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

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

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

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

+0

я не получил какой-либо метод Version.Parse – Millerbean

+0

@Millerbean ах, вы, возможно, придется попробовать ' TryParse', или 'new Version (...) ', в зависимости от вашей версии фреймворка. –

-1

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

+2

164 редко бывает между 15 и 70 годами при сортировке естественно –

+0

да, но если вы сделаете строку сравнения, это будет :). как сравнение строк, это сравнение символов слева направо. Следовательно, вам нужно либо преобразовать его в double после распада, либо следовать другим комментариям по поиску версии. –

2

Мне пришлось делать естественную сортировку некоторое время назад. Не помню, где я нашел код, но он застрял в моем блоге для будущей ссылки: 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)); 
1

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

Смежные вопросы