質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

1742閲覧

漢数字および上中下をナチュラルなかたちで並べるプログラム

startnote

総合スコア24

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2016/05/06 03:34

エクスプローラorコマンドプロンプトについて相談です。

●dirの結果
2016/05/06 12:14 0 〇.txt
2016/05/06 12:14 0 一.txt
2016/05/06 12:14 0 七.txt
2016/05/06 12:14 0 三.txt
2016/05/06 12:14 0 上.txt
2016/05/06 12:14 0 下.txt
2016/05/06 12:14 0 中.txt
2016/05/06 12:14 0 九.txt
2016/05/06 12:14 0 二.txt
2016/05/06 12:14 0 五.txt
2016/05/06 12:14 0 八.txt
2016/05/06 12:14 0 六.txt
2016/05/06 12:14 0 十.txt
2016/05/06 12:14 0 千.txt
2016/05/06 12:14 0 参.txt
2016/05/06 12:14 0 四.txt
2016/05/06 12:14 0 壱.txt
2016/05/06 12:14 0 弐.txt
2016/05/06 12:14 0 百.txt

●エクスプローラ
〇.txt
一.txt
壱.txt
下.txt
九.txt
五.txt
三.txt
参.txt
四.txt
七.txt
十.txt
上.txt
千.txt
中.txt
二.txt
弐.txt
八.txt
百.txt
六.txt

というのが、漢数字および上中下を並べた結果なのです。
これをナチュラルなかたちで並べるプログラムをC#で作って、エクスプローラorコマンドプロンプトに組み込むことはできますか?
dirk(k for 漢数字)というプログラムならできそうで、

string[] files = Directory.GetFiles();
List<string> otherfiles = new List<string>();
List<string> file01s = new List<string>();
List<string> file02s = new List<string>();
以下くり返し

foreach(string file in files){
if (Path.GetFileName(file).StartsWith("一")) file01s.Add(file);
以下くり返し

else otherfiles.Add(file);
}
foreach(string file in file01s)
Console.WriteLine(file)
foreach(string file in file02s)
Console.WriteLine(file)
以下くり返し
foreach(string file in otherfiles)
Console.WriteLine(file)
のように、いちど分けてから出力する、みたいなのは思いついたのです。
もっとスマートなorなにかすごいノウハウorエクスプローラに組み込める方法などをご存じできたらご示唆ください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tkturbo

2016/05/06 03:49

「理想的にはどのように出力されるべきか」を追記して頂いてもよいですか?
startnote

2016/05/06 09:10

一壱二弐三参四五六七八九〇十百千 上中下 とかかなと思います。
guest

回答1

0

ベストアンサー

「漢数字と一部の特殊文字のみを特別な順序で並べ替えたい」という要望でいいですか?
(とりあえずその前提でコードを書いてみましょう。)

A群:漢数字(〇~十、百、千)
B群:旧字体の漢数字(壱、弐、参)
C群:一部の特殊文字(上、中、下)

と仮定し、さらに全体として、A群→B群→C群→その他の文字の順で並べ替えるのであれば「List#Sort()」を拡張してやればよいのではないでしょうか?

C♯

1/* クラス内のstatic変数 */ 2static char[] SpecialSortValues = { 3 /* A群 */ '〇','一','二','三','四','五','六','七','八','九','十','百','千', 4 /* B群 */ '壱','弐','参', 5 /* C群 */ '上','中','下' 6 };

C♯

1/* 並べ替え部分 */ 2string[] files = Directory.GetFiles(); 3List<string> fileNames = new List<string>(); 4foreach(string file in files){ 5 fileNames.Add(Path.GetFileName(file)); 6} 7// List#Sortの拡張 8fileNames.Sort(delegate(string a, string b){ 9 // 両方nullなら同順 10 if(a == null && b == null) return 0; 11 // 片方nullならnullが先 12 if(a == null) return -1; 13 if(b == null) return 1; 14 // 先頭文字をcharで取得:特殊な並び順に該当するかをチェック 15 int indA = Array.IndexOf(SpecialSortValues, a[0]); 16 int indB = Array.IndexOf(SpecialSortValues, b[0]); 17 // 両方が特殊な並び順に該当する場合、特殊な並び順で比較 18 if(indA > -1 && indB > -1) return indA-indB; 19 // 片方が特殊な並び順に該当する場合、特殊な並び順の文字が先 20 if(indA > -1) return -1; 21 if(indB > -1) return 1; 22 // 特殊な並び順に該当しない場合、通常の並び順 23 return a.CompareTo(b); 24}); 25foreach(string file in fileNames){ 26 Console.WriteLine(file); 27}

投稿2016/05/06 06:39

tkturbo

総合スコア5572

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

startnote

2016/05/06 09:17

ありがとうございます。 これ、エクスプローラに組み込むのはたいへんですか?
tkturbo

2016/05/06 09:21

コマンドプロンプトで使用するならexe形式でコンパイルし、環境変数PATHにそのexeファイルのフルPathを追加してあげれば行けると思います。 MSのExplorerに組み込むのはちょっと難易度が高いのではないでしょうか。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問