ファイル優先のファイル一覧に並び替えたい

ファイル優先のファイル一覧に並び替えたい

環境


現状

f:id:kawaishi2:20210610174300p:plain

こんな感じに階層になっているファイル一覧をとってきた。

なぜか「ファイル名」でソートされてしまっている...。

// 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

以上