C#中的自然数字排序

时间:2012-02-24 12:21:03

标签: c# sorting

在C#

中排序通用列表时遇到问题

我有一个List<MyObjects> myListMyObject有一个字符串属性。

现在,当按降序排序

时,它看起来像这样
  

88年4月2日

     

70年4月2日

     

2.4.164 - &gt;这是错误的

     

2.4.15

如何对列表进行排序?

我试过了:

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

它不是使用Linq(旧框架)的选项

更新:我的列表还可以包含N / A

6 个答案:

答案 0 :(得分:4)

你无法比较字符串,因为很明显这是正确的字符串排序。您需要解析数字或Version类的实例:

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

答案 1 :(得分:2)

也许可以通过版本排序?

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

当然,如果你只进行一次解析会更便宜(可能会version成为Version而不是string

答案 2 :(得分: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));

答案 3 :(得分:1)

如果您的字符串模式适合.Net版本类,则将其转换为Version对象并compare

答案 4 :(得分:1)

也许这些可能对你有帮助:

答案 5 :(得分:-1)

你能说出它是怎么回事吗?看起来它完全按顺序排列。但是,只是一个随机的建议,如果你确定格式,你可以打破字符串并转换为数字来检查这种东西。