ファイル優先のファイル一覧に並び替えたい
環境
現状
こんな感じに階層になっているファイル一覧をとってきた。
なぜか「ファイル名」でソートされてしまっている...。
// temp に一覧データが入っている Debug.WriteLine(string.Join("\r\n", temp)); C:\root\300\1.md C:\root\300\2.md C:\root\200\200_10\200_1.md C:\root\200\200_20\200_1.md C:\root\200\200_10\200_2.md C:\root\200\200_20\200_2.md C:\root\200\200_20\200_3.md C:\root\200\200_20\200_4.md C:\root\README.md C:\root\releasenotes.md C:\root\400\Sample.md C:\root\100\top.md
要望
取得済の一覧を、パス順で並び替えた一覧に並び替えたい。
ただし、同一階層内では「フォルダ(の中)」よりも「ファイル」を優先とする。
(取得する方はコード変更できない)
対応
下記で希望した形になった。
- GroupBy で、親フォルダ順に並べる
- SelectManyで、展開
もう少しスマートにならないものか。
var t3 = temp.GroupBy(x => System.IO.Path.GetDirectoryName(x)) .OrderBy(f => f.Key) .SelectMany(x => x.OrderBy(f => f)); Debug.WriteLine(string.Join("\r\n", t3)); C:\root\README.md C:\root\releasenotes.md C:\root\100\top.md C:\root\200\200_10\200_1.md C:\root\200\200_10\200_2.md C:\root\200\200_20\200_1.md C:\root\200\200_20\200_2.md C:\root\200\200_20\200_3.md C:\root\200\200_20\200_4.md C:\root\300\1.md C:\root\300\2.md C:\root\400\Sample.md
失敗1:
パスでソート
これだと、ファイル(README.md)が末尾に並んでしまう…。
var t1 = temp.OrderBy(x => x); Debug.WriteLine(string.Join("\r\n", t1)); C:\root\100\top.md C:\root\200\200_10\200_1.md C:\root\200\200_10\200_2.md C:\root\200\200_20\200_1.md C:\root\200\200_20\200_2.md C:\root\200\200_20\200_3.md C:\root\200\200_20\200_4.md C:\root\300\1.md C:\root\300\2.md C:\root\400\Sample.md C:\root\README.md C:\root\releasenotes.md
失敗2:
第一ソートキーに 階層数(の代わりに区切り文字数)
第二ソートキーに パス
駄目でした。(そりゃそうか・・・)
var t2 = temp.OrderBy(x => (x.Where(c => c == '\\')).Count()).ThenBy(f => f); Debug.WriteLine(string.Join("\r\n", t2)); C:\root\README.md C:\root\releasenotes.md C:\root\100\top.md C:\root\300\1.md C:\root\300\2.md C:\root\400\Sample.md C:\root\200\200_10\200_1.md C:\root\200\200_10\200_2.md C:\root\200\200_20\200_1.md C:\root\200\200_20\200_2.md C:\root\200\200_20\200_3.md C:\root\200\200_20\200_4.md
以上