2016-08-21 28 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();