2017-06-26 16 views
-5

例に基づいて:
ソートリスト<string>文字カウント

List<string> folders = new List<string>(); 
folders.Add("folder1/folder2/folder3/"); 
folders.Add("folder1/"); 
folders.Add("folder1/folder2/"); 

私は文字に基づいて、このリストをソートしたいつまり '/' ので、私の出力は
のfolder1/
のfolder1 /フォルダ2/
になります のfolder1 /フォルダ2/FOLDER3

+4

'x/y/z/k'と' folder1/folder2'についてはどうですか? –

+2

"文字に基づいて、つまり '/'はどういう意味ですか? 「その特定のキャラクターを数える」という意味ですか?または文字列全体の長さだけ? –

+0

入力が 'folder1 /' 'folder1/folder2 /' 'folder1/folder3 /' 'folder1/folder2/folder4 /' 'folder11 /'の場合はどうなりますか? – mjwills

答えて

6

LINQ:

folders = folders.OrderBy(f => f.Length).ToList(); // consider null strings 

またはList.Sort

folders.Sort((s1, s2) => s1.Length.CompareTo(s2.Length)); 

安全なアプローチリストがnullの含まれていることができれば:あなたが実際にフォルダの深さではない文字列の長さでソートしたい場合は

folders = folders.OrderBy(f => f?.Length ?? int.MinValue).ToList(); 

を:

folders = folders.OrderBy(f => f.Split(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar).Length).ToList(); 
+2

Iリスト内のいずれかの文字列がnullの場合、例外がスローされると考えてください。 –

+0

あなたの変更は私の 'f?.Length ?? (正確に)空文字列の前にヌル文字列をソートするようになりました。 –

+0

これは、OPが要求した出力を与えません。例えば、 ** m/pics/nat ** は の前に来る** mypersonal_stuff/pictures **、彼は階層的な注文を望む –

0

それはあなたが実際に名前でソートする可能性があります:これは、このような場合のために正しく動作します

folders.Sort(); 

folders = folders.OrderBy(f => f).ToList(); 

それとも単に単独の長さによってソート

folder1/ 
folder1/subfolder1 
folder1/subfolder1/subsubfolder 
folder2 
folder2/subfolder2 

を検討します"folder1"および"folder2"と等しい。