39066


タイトルの件、ある文字列を入力として、  
決まったルールに則り変換後の値を返却するメソッドを  
C#で作成したいと思います。  
ただ、いろいろなやり方があると思います。  
下記は、私が考えた一例ですが、  
一般的なやり方でスマートな方法はありますでしょうか？  
OSS等での実装方法等知見がありましたら、ご教示頂きたくよろしくお願いいたします。  
(1)if文の羅列 ※この方法はあまりきれいではないので採用したくありません。  
string origial = "ORIGINAL";  
string new = string.Empty;  
if(original == "ORIGINAL"){  
new = "ORG";  
}  
else if(original == "ORIGINAL1"){  
new = "ORG1";  
}

(2)Dictionaryに変換マスタを持たせて変換する。  
(3)列挙型を定義して変換する。

なお、メモリ容量を気にするほど大量に定義があるわけではありません。（数百のオーダー）  
また、パフォーマンスもそこまでシビアに求めておりません。


CC BY-SA 3.0
2017-10-27T01:11:54.137
39058
2017-12-27T10:35:11.437
2017-10-27T08:16:26.587
9228
9228
question
c#
C# 文字列のコンバーター機能の一般的な実装方法について


どのようなルールを想定しているのでしょうか？

ad hocなルールなら変換ルールをDictionaryに持たせるのが素直な対処方法だと思います。  
IF構文や列挙型を使う方法は、ルールが変更された際のコード修正が面倒ですし、コードから変換ルールを読み取るのも煩わしいので、お勧めできません。

正規表現に書き換えられるルールなら、正規表現を使うのが良いと思います。


CC BY-SA 3.0
2017-10-27T02:46:06.477
39066
2017-10-27T02:46:06.477
217
39058
answer


自分でしたら下記のようなレポジトリパターンで管理するでしょうか。

[code]

    public class ResourceRepository {
        private readonly IReadOnlyDictionary<string, string> _map = new Dictionary<string, string> {
            ["ORIGINAL"] = "ORG",
            ["ORIGINAL1"] = "ORG1",
            // ...
        };
    
        public string Find(string key) {
            string result;
            return _map.TryGetValue(key, out result) ? result : null;
        }
    
        public bool Contains(string key) {
            return _map.ContainsKey(key);
        }
    }
    
[/code]

使い方はこんな感じ。

[code]

    class Program {
        private static ResourceRepository _resourceRepository = new ResourceRepository();
    
        private static void Main(string[] args) {
            var key = Console.ReadLine();
    
            var result = _resourceRepository.Find(key);
            Console.WriteLine(result);
        }
    }
    
[/code]

上記はマッピングルールが静的に決まっているシンプルな例ですが、`Add` や `Save`
メソッドを用意してプログラマブルにルールを増やしたり、コンストラクタでデータソース（JSON や
XML、データベース接続等）を渡してマッピングルールを構築したり、といった拡張が考えられると思います。


CC BY-SA 3.0
2017-12-27T10:35:11.437
40555
2017-12-27T10:35:11.437
26808
39058
answer