2016-03-27 207 views
1

该语言是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,但这需要将字符串拆分为一个字符串部分数组。我将如何使用已有的数组来实现刚刚描述的结果?我需要以某种方式将我的第一个数组放入新数组中,反之亦然?

回答

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),这将在第一个空间拆分,以防第二个半空间包含您想要在排序中考虑的空间。

+0

其实,这个作品完美,接受,谢谢! –

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

在这里你可以看到我使用的是基于名称的最后一部分排序列表(如果存在)的自定义排序比较表。无论名称是否由空格分隔,它都能正常工作,以便与索引无关。