2016-08-21 25 views
2

排序的文件路径集合我有一个字符串的集合:如何使用C#LINQ

/a/b/111.txt 
/a/b/c/222.txt 
a/b/333.txt 
a/b/c/d/444.txt 

我想这个集合进行排序是这样的:

/a/b/111.txt 
a/b/333.txt 
/a/b/c/222.txt 
a/b/c/d/444.txt 

因此,所有a/b分组一起等等。

这可以使用linq来完成吗?或者以其他方式?

+0

你不能只用'Path.GetDirectoryName(inputStringPathHere)'排序? – Xerillio

+0

'data.OrderBy(x => x.Split('/')。Length)'? – haim770

回答

0

你可以做到这一点,

List<string> values = new List<string>(); 
values.Add("/ a /b/111.txt"); 
values.Add("/ a/b/c/222.txt"); 
values.Add("a/b/333.txt"); 
values.Add("a/b/c/d/444.txt");    
var sortedList = values.OrderBy(p => p.Count(c => c == Path.DirectorySeparatorChar || c == Path.AltDirectorySeparatorChar)); 

工作​​

+0

这个解决方案的问题在于,例如,如果在序列的开头有一个类似'/ p/q/222.txt'的路径,它可以作为第一个元素 – octavioccl

1

您可以通过从字符串中的所有斜线实现这一目标进行比较:

items.OrderBy(item => item.Replace("/", "")); 
2

鉴于

var input = new [] 
{ 
    @"https://stackoverflow.com/a/b/111.txt", 
    @"https://stackoverflow.com/a/b/c/222.txt", 
    @"a/b/333.txt", 
    @"a/b/c/d/444.txt", 
}; 

您可以通过删除“正常化”字符串中的领先/(如果有的话),并用它作为排序键:

var output = input.OrderBy(s => s.TrimStart('/')).ToList();