C# 如何使用字符串执行数字有效排序?

C# 如何使用字符串执行数字有效排序?,c#,.net,list,sorting,C#,.net,List,Sorting,我有一个我称之为页面的项目列表 每个页面项都有以下内容: int id { get; set; } string filename { get; set; } int status { get; set; } 我遇到的问题是文件名字段的顺序如下: 1.tif 10.tif 1.tif 2.tif pageList.Sort((a, b) => Int32.Parse(a.ImageName.Replace(".tif", "")).CompareTo(Int32.Parse(b.I

我有一个我称之为页面的项目列表

每个页面项都有以下内容:

int id { get; set; }
string filename { get; set; }
int status  { get; set; }
我遇到的问题是文件名字段的顺序如下:

1.tif
10.tif
1.tif
2.tif
pageList.Sort((a, b) => Int32.Parse(a.ImageName.Replace(".tif", "")).CompareTo(Int32.Parse(b.ImageName.Replace(".tif","")))
我需要在列表中按如下顺序排列:

1.tif
10.tif
1.tif
2.tif
pageList.Sort((a, b) => Int32.Parse(a.ImageName.Replace(".tif", "")).CompareTo(Int32.Parse(b.ImageName.Replace(".tif","")))
我尝试了以下方法,但运气不佳:

pageList.Sort((a, b) => String.Compare(a.ImageName, b.ImageName));
谢谢

使用System.Linq;//System.Core.dll
using System.Linq; // System.Core.dll

IEnumerable<Page> sequence = pageList.OrderBy(x => x.ImageName); // not in-place sort

List<Page> list = sequence.ToList();
IEnumerable sequence=pageList.OrderBy(x=>x.ImageName);//不到位排序 List=sequence.ToList();
严格按照您的示例,您需要以下内容:

1.tif
10.tif
1.tif
2.tif
pageList.Sort((a, b) => Int32.Parse(a.ImageName.Replace(".tif", "")).CompareTo(Int32.Parse(b.ImageName.Replace(".tif","")))

如果我没弄错你的问题,你想按自然的数字顺序对“数字”文件名进行排序

这篇文章可能会给你一些提示:

我相信:

pageList = pageList.GroupBy(p => p.filename.Substring(p.filename.IndexOf('.') + 1)).
    OrderBy(g => g.Key).SelectMany(g => g.OrderBy(p => p.filename)).ToList();

将按扩展名然后按文件名为列表排序。

如果要查找对字母和数字顺序都敏感的排序顺序,如Windows资源管理器中的排序顺序,则称为“自然排序顺序”

以下问题和答案将有所帮助:


我收到以下错误:System.Collections.Generic.List'不包含“OrderBy”的定义请注意,这不会对列表进行排序。相反,它返回一个新的序列,当您循环遍历该序列时,该序列将被排序。您是否需要就地排序(对列表本身进行排序,不仅创建一个新的,而且是已排序的实例),或者这不重要?您的意思是将
{1,10,2}
排序为
{1,2,10}
?也可以看到这个示例看起来不错,但结果相同。下面是我尝试的:pageList.Sort((a,b)=>String.Compare(Path.GetFileNameWithoutExtension(a.ImageName),Path.GetFileNameWithoutExtension(b.ImageName));我这样做是因为在ImageName中的1.tif之前,我有一个路径,但路径总是相同的。@Shane-Matt提供的示例是可靠的。其主要思想是,您需要提取文件名的整数部分,以便将其作为数字进行比较。如您在评论中所述,使用
String.Compare
,忽略了示例中最重要的部分。如果您将
ImageName.Replace(…)
更改为提取字符串中应该设置的数字部分的内容。@Keleb好的,我把Int32.Parse()弄糟了,但在将代码更改为此后,它现在可以工作了:pageList.Sort((a,b)=>Int32.Parse(Path.GetFileNameWithoutExtension(a.ImageName)).CompareTo(Int32.Parse(Path.GetFileNameWithoutExtension(b.ImageName));