姓氏按字母顺序排列

时间:2016-03-27 03:30:19

标签: c# arrays string split listbox

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

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

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

2 个答案:

答案 0 :(得分: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),它将在第一个空格中拆分,以防后半部分可能包含您要在排序中考虑的空格。

答案 1 :(得分:1)

您可以使用自定义比较器进行列表和排序。

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

在这里你可以看到我正在使用自定义比较器排序列表,该比较器是基于名称的最后部分(如果存在)排序列表。无论名称是否以空格分隔,它都将完美地运行,而不依赖于索引。