语言是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,但这需要将一个字符串拆分成一个字符串部分数组。我如何使用我已经拥有的数组来实现我刚才描述的结果?我是否需要以某种方式将我的第一个数组放入新数组中,反之亦然?
答案 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));
}
在这里你可以看到我正在使用自定义比较器排序列表,该比较器是基于名称的最后部分(如果存在)排序列表。无论名称是否以空格分隔,它都将完美地运行,而不依赖于索引。