【问题标题】:Last names in alphabetical order姓氏按字母顺序排列
【发布时间】:2016-03-27 03:30:19
【问题描述】:

语言是 C#。我有一个名为“a e”、“b d”、“c c”、“d b”和“e a”的五个目录。它们按字母顺序出现在列表框中,因为我编写了以下代码:

        string[] dirs = Directory.GetDirectories(@"C:\mainFolder\");
        foreach (string dir in dirs)
        {
            listBox1.Items.Add(Path.GetFileName(dir));
        }

我希望他们不是按照他们名字前半部分的字母顺序出现,而是按照他们名字后半部分的字母顺序出现。他们的名字将来可能会改变,即使在那之后,我也需要他们保持他们名字后半部分的字母顺序,但不用担心,我已经设置了控制措施,始终确保他们只有两半分开通过一个空格(名称中唯一允许的空格。)我研究了 MSDN 并得出结论,我可能需要this method,但这需要将字符串拆分为字符串部分的数组。我将如何使用我已经拥有的数组来实现我刚才描述的结果?我是否需要以某种方式将我的第一个数组放入新数组中,反之亦然?

【问题讨论】:

    标签: c# arrays string split listbox


    【解决方案1】:

    你可以像这样使用Linq的OrderyBy

    string[] dirs = Directory.GetDirectories(@"C:\mainFolder\");
    foreach (string dir in dirs.OrderBy(p => p.Split(' ')[1]))
    {
        listBox1.Items.Add(Path.GetFileName(dir));
    }
    

    请注意,如果拆分没有产生至少两个项目(意味着没有空间),这将引发异常。或者,您可以使用p.Split(new [] { ' ' }, 2),它只会在第一个空格上拆分,以防后半部分可能包含您要在排序时考虑的空格。

    【讨论】:

    • 其实这个很完美,接受了,谢谢!
    【解决方案2】:

    您可以使用 List 并使用自定义比较器进行排序。

    var dirs = new List<string>(Directory.GetDirectories(@"C:\mainFolder\"));
    
    dirs.Sort((x, y) => {
        var lhs = x.Split(' ');
        var rhs = y.Split(' ');
    
        return lhs.LastOrDefault().CompareTo(rhs.LastOrDefault());
    
    });
    
    foreach(var dir in dirs){
        listBox1.Items.Add(Path.GetFileName(dir));
    }
    

    在这里您可以看到我正在使用自定义比较器对列表进行排序,该比较器基于名称的最后一部分(如果存在)对列表进行排序。无论名称是否用空格分隔,它都可以正常工作,顺序单词独立于索引。

    【讨论】:

      猜你喜欢
      • 2020-09-10
      • 2018-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-08
      • 1970-01-01
      相关资源
      最近更新 更多