2016-07-14 4 views
-2

複数の文字列を取り込み、それらが空/空であるかどうかによって複雑なパターンで連結/書式設定するC#関数をどのように構築しますか?たとえば、のは、私は3つの文字列A、B、およびCを持っており、次のように返すようにしたいとしましょう:C#での複雑なオプションの文字列の連結と書式設定

+------+------+---------+---------------------------+ 
| A | B | C  | Result     | 
+------+------+---------+---------------------------+ 
| "" | "" | ""  | ""      | 
+------+------+---------+---------------------------+ 
| "4" | "" | ""  | "4p"      | 
+------+------+---------+---------------------------+ 
| "8" | "15" | ""  | "8 - 15p"     | 
+------+------+---------+---------------------------+ 
| "" | "" | "blue" | "blue section"   | 
+------+------+---------+---------------------------+ 
| "" | "16" | "red" | "16p, red section"  | 
+------+------+---------+---------------------------+ 
| "23" | "42" | "green" | "23 - 42p, green section" | 
+------+------+---------+---------------------------+ 

あなたが見ることができるように、特定の要素が存在する場合は追加されているいくつかの形式の作品があり、そして複数の要素に依存するその他。これは、if文と連結を手動で行うだけで済むのですか?そういう文字列を組み立てるツールがありますか?

+2

出力文字列の "追加"に関する明示的な規則はありますか?そうでない場合、私はそれを行うための一般的な方法はないと思います。もし存在すれば...私はまだ疑問がある。私はそれを静的ヘルパーメソッドまたは拡張メソッドとして解決しますが。 –

+0

また、私はif文でそれをすることを勧めません。オブジェクト指向のアプローチに進んでください。たくさんのクラスとカスタマイズされた文字列ビルダーを構築します。 –

+0

上記の配列の組み合わせは他にもありますか?たとえば、A = 4、B = ""、C = "blue"の場合はどうなりますか? – Steve

答えて

2

説明したように簡単なものとして、比較的少数のif文を書くことができます。または、複数の書式文字列を作成し、適切な書式文字列を選択することができます。わずか8つの可能性があるので、簡単にこれを列挙してコード化することができます。考えてみましょう:

[Flags] 
StringFormatFlags 
{ 
    AExists = 4, 
    BExists = 2, 
    CExists = 1, 
    FormatNone = 0, 
    FormatC = CExists, // 1 
    FormatB = BExists, // 2 
    FormatBC = BExists | CExists, // 3 
    FormatA = AExists, // 4 
    FormatAC = AExists | CExists, // 5 
    FormatAB = AExists | BExists, // 6 
    FormatABC = AExists | BExists | CExists, // 7 
}; 

あなたはその後、A、B、およびCの値に基づいて値を初期化することができます

StringFormatFlags val = StringFormatFlags.FormatNone; 
if (!string.IsNullOrEmpty(A)) 
    val |= StringFormatFlags.AExists; 
if (!string.IsNullOrEmpty(B)) 
    val |= StringFormatFlags.BExists; 
if (!string.IsNullOrEmpty(C)) 
    val |= StringFormatFlags.CExists; 

の1に対応する、0から7まであなたに価値を与えますその列挙の値はFormatです。最後に、

string[] FormatStrings = new string[] 
{ 
    "{1}{2}{3}", // 0 - None 
    "{1}{2}{3}", // 1 - C only 
    "{1){2}p{3}", // 2 - B only 
    "{1}{2}p,{3}", // 3 - B and C 
    "{1}p{2}{3}", // 4 - A only 
    "{1}p{2},{3}", // 5 - A and C 
    "{1} - {2}p{3}", // 6 - A and B 
    "{1} - {2}p,{3}", // A, B, C 
} 

をそして:

さて、8つの異なる形式の文字列を作成

string formattedString = string.Format(FormatStrings[(int)val], A, B, C); 

ここで重要なのは、中括弧内の数字(すなわち{2})があれば、何も発生しないということです対応するパラメータがnullまたは空です。

+0

若干最適化されていますが、私が得ようとしているほど良くなります。 – tloflin