質問するログイン新規登録

回答編集履歴

1

refactor

2018/08/06 14:27

投稿

papinianus
papinianus

スコア12705

answer CHANGED
@@ -1,20 +1,19 @@
1
1
  ちょ、退会すんなよ。
2
2
 
3
- 100を百にしようと思うと大変だけど、一〇〇でいいなら、Linqでワンライナー
3
+ 100を百にしようと思うと大変だけど、一〇〇でいいなら、Linqで。
4
- 漢数字をlist(配列とかList)でもつか、map(Dictinary)でもつか2パターン
5
- 引数を数字と見るか、文字列と見るかで2パターン
6
- (さらに書きませんでしたが文字列の場合、数値だけを抜き出しておきかえる、というパターンもあり得るが、Where(char.isDigit)をSelectの前に入れればいいので)
7
- C#でこの程度で10回if書いてたら話になりません。
8
4
 
9
5
  ```csharp
10
- static string ConvertToKansuji(int n)
11
- {
12
- var kansuji = new[] { "〇", "一", "二", "三", "四", "五", "六", "七", "八", "九", };
13
- return string.Concat(n.ToString().ToCharArray().Select(digit => kansuji[(int)char.GetNumericValue(digit)]));
14
- }
15
- static string ConvertToKansuji(string str)
16
- {
17
- var kansuji = new Dictionary<char, string> { { '0', "〇" }, { '1', "一" }, { '2', "二" }, { '3', "三" }, { '4', "四" }, { '5', "五" }, { '6', "六" }, { '7', "七" }, { '8', "八" }, { '9', "九" }, };
18
- return string.Concat(str.ToCharArray().Select(c => char.IsDigit(c) ? kansuji[c] : c.ToString()));
19
- }
6
+ static string ConvertToKansuji(int n) => string.Concat(EnumerateDigits(n).Select(i => ToKansujiOnBaseByString(i)).Reverse());
7
+ static string ConvertToKansuji(string str, bool onlyDigits = false) => string.Concat(str.ToCharArray().Where(c => !onlyDigits || char.IsDigit(c)).Select(c => char.IsDigit(c) ? ToKansujiOnBaseByDictionary(c) : $"{c}"));
8
+ static IEnumerable<int> EnumerateDigits(int n, int unit = 10)
9
+ {
10
+ while (n >= unit)
11
+ {
12
+ yield return n % unit;
13
+ n = n / unit;
14
+ }
15
+ }
16
+ static string ToKansujiOnBaseByString(int n, int unit = 10) => unit > 10 || n >= unit ? throw new InvalidOperationException("illegal") : $"{"〇一二三四五六七八九"[n]}";
17
+ static string ToKansujiOnBaseByArray(int n, int unit = 10) => unit > 10 || n >= unit ? throw new InvalidOperationException("illegal") : (new[] { "〇", "一", "二", "三", "四", "五", "六", "七", "八", "九", })[n];
18
+ static string ToKansujiOnBaseByDictionary(char n, int unit = 10) => unit > 10 || !char.IsDigit(n) || (int)char.GetNumericValue(n) >= unit ? throw new InvalidOperationException("illegal") : (new Dictionary<char, string> { { '0', "〇" }, { '1', "一" }, { '2', "二" }, { '3', "三" }, { '4', "四" }, { '5', "五" }, { '6', "六" }, { '7', "七" }, { '8', "八" }, { '9', "九" }, })[n];
20
19
  ```