首页 新闻 会员 周边

C# List<T>.Sort()排序问题

0
悬赏园豆:20 [已解决问题] 解决于 2019-08-02 14:13

代码很简单,就是初始化一个List<string>,然后对他排序,再输出出来。
排序规则是按数字从小到大,相同数字的 f.pdf 在 b.pdf 的前面。
前面的都排对了,单就最后两个40b.pdf,40f.pdf没有排对,请问是哪里出了问题

HotSky的主页 HotSky | 菜鸟二级 | 园豆:223
提问于:2019-06-22 16:14
< >
分享
最佳答案
0

在你比较的第一行加上
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];
  });
收获园豆:20
前行丶 | 菜鸟二级 |园豆:219 | 2019-07-05 16:37
其他回答(4)
0

你的if(ss1==40&&ss2==40)的下一行是不是有个;

Shendu.CC | 园豆:2138 (老鸟四级) | 2019-06-22 17:02

这是发现问题后我为了打断点加入的代码,跟这个没有关系,问题不是这个

支持(0) 反对(0) HotSky | 园豆:223 (菜鸟二级) | 2019-06-22 17:51
0

打个断点看一下最后比较的s1和s2具体比较的值

小光 | 园豆:1766 (小虾三级) | 2019-06-24 09:55
0

改下代码就好了:

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);
}
三人乐乐 | 园豆:4819 (老鸟四级) | 2019-06-24 14:09

按照你的list里只有4项是没有问题的,但是像我这样从1开始到40x2共80项,始终不对,你可以试试list里从1到40x2看看是不是跟我的一样,

支持(0) 反对(1) HotSky | 园豆:223 (菜鸟二级) | 2019-06-24 16:20

@HotSky: 测试了,到最后一个时不时出错,但问题可以解决,有两个办法:
1.最后一组,你直接拿出来判定;
2.添加一组临时数据到最后,然后移除。

支持(1) 反对(0) 三人乐乐 | 园豆:4819 (老鸟四级) | 2019-06-25 11:16
0

你把==40的判断代码去掉呢

Mr·林 | 园豆:150 (初学一级) | 2019-06-25 16:30
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册