在你比较的第一行加上
if (s1 == s2) return 0;
由于你固定返回1和-1而没考虑相同的情况从而导致排序混乱
m:
list.Sort((str, str2) =>
{
var dot = str.IndexOf('.', StringComparison.CurrentCulture);
var dot2 = str2.IndexOf('.', StringComparison.CurrentCulture);
if (dot != dot2)
return str.CompareTo(str2);
for (i = 0; i < dot - 1; i++)
if (str[i] != str2[i])
return str.CompareTo(str2);
return str2[dot2 - 1] - str[dot - 1];
});
你的if(ss1==40&&ss2==40)
的下一行是不是有个;
?
这是发现问题后我为了打断点加入的代码,跟这个没有关系,问题不是这个
打个断点看一下最后比较的s1和s2具体比较的值
改下代码就好了:
List<string> lst = new List<string>
{
{ "39f.pdf "},
{ "39b.pdf" },
{ "40b.pdf" },
{ "40f.pdf "},
};
lst.Sort((s1, s2) =>
{
int ss1 = Convert.ToInt32(s1.Substring(0, s1.LastIndexOf('.') - 1));
int ss2 = Convert.ToInt32(s2.Substring(0, s2.LastIndexOf('.') - 1));
if (ss1 == ss2)
{
return s1.EndsWith("b.pdf") ? 1 : -1;// <--- 改这一句:如果 s1 不包含 b.pdf,就会跳过判定,使用默认值,那就是 f 在前了
}
return ss1 < ss2 ? -1 : 1;
});
foreach (var item in lst)
{
Console.WriteLine(item);
}
按照你的list里只有4项是没有问题的,但是像我这样从1开始到40x2共80项,始终不对,你可以试试list里从1到40x2看看是不是跟我的一样,
@HotSky: 测试了,到最后一个时不时出错,但问题可以解决,有两个办法:
1.最后一组,你直接拿出来判定;
2.添加一组临时数据到最后,然后移除。
你把==40的判断代码去掉呢