C# List.Sort()排序问题

2019-08-02 14:02发布

问题:

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

回答1:

在你比较的第一行加上
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];
  });


回答2:

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



回答3:

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



回答4:

改下代码就好了:

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);
}


回答5:

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