在C#
中排序通用列表时遇到问题我有一个List<MyObjects> myList
,MyObject
有一个字符串属性。
现在,当按降序排序
时,它看起来像这样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
答案 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)
你能说出它是怎么回事吗?看起来它完全按顺序排列。但是,只是一个随机的建议,如果你确定格式,你可以打破字符串并转换为数字来检查这种东西。