2017-05-11 2 views
1

テキストをparams object[]で受け取り、colourizesする関数を自分で作成することはできません。メソッド:パラメータオブジェクトのカラーコンソール文字列[] prms

protected void ColorToConsole(ConsoleColor c, string s, params object[] p) { 
    Console.ForegroundColor = c; 
    Console.Write(string.Format(s, p)); 
} 

ColorToConsole(ConsoleColor.Blue, "I like {0}", pのような関数を呼び出したいと思います。私はpだけが青で色付けされると期待しています。私は異なったpのための複数の色を提供することができる別の方法を得ることを試みているが、私はここで立ち往生している。ここで

+0

回答を更新し、最終的には取得しようとしていた機能に一致します。 –

答えて

1

UPDATE 4

は、あなたが、それがどこ色付きのテキストを配置する場所を見つけ、それをやって、与えられた値を解析しています望んでいるコードです。

using System; 
using System.Linq; 
using System.Text.RegularExpressions; 

namespace ConsoleApp1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 

      Console.WriteLine("Hello {{1}} {0}", "Henry"); 
      WriteLine(ConsoleColor.Red, "Hello {0},{2} {1} asd {1} {0} {2}", "Name1", "Name2", "Name3"); 
      WriteLine(ConsoleColor.Red, "Hello {{1}} {0}", "Henry"); 
      Console.WriteLine("Hello {{1}} {0}", "Henry","David"); 
      WriteLine(ConsoleColor.Green,"Hello {{1}} {0}", "Henry", "David"); 
      try 
      { 
       Console.WriteLine("Hello {{1}} {1} {0}", "Henry"); 
      } 
      catch(Exception exc) 
      { 
       Console.WriteLine(exc.Message); 
      } 

      try 
      { 
       WriteLine(ConsoleColor.Red, "Hello {{1}} {1} {0}", "Henry"); 
      } 
      catch (Exception exc) 
      { 
       Console.WriteLine(exc.Message); 
      } 

     } 
     public static void WriteLine(ConsoleColor c, string value, params object[] prms) 
     { 
      var regEx = new Regex("{[0-9]+}"); 
      var matches = regEx.Matches(value); 
      int i = 0; 
      int newLenght = (value.Length - 3 * (prms.Length) + (int)prms.Sum(x => ((string)x).Length)); 
      var valueArr = value.ToCharArray(); 
      foreach (Match m in matches) 
      { 
       while (i < m.Index && i < valueArr.Length) 
       { 
        Console.Write(valueArr[i]); 
        i++; 
       } 

       if (valueArr[i].Equals('{') && i+m.Value.Length< valueArr.Length && valueArr[i + m.Value.Length].Equals('}')) 
       { 
        i += m.Value.Length; 
        Console.Write(m.Value.Trim('{', '}')); 
       } 
       else if (int.Parse(m.Value.Trim('{', '}')) < prms.Length) 
       { 
        i += m.Value.Length; 
        Console.ForegroundColor = c; 
        Console.Write(prms[int.Parse(m.Value.Trim('{', '}'))]); 
        Console.ResetColor(); 
       } 
       else 
       { 
        throw new Exception("Index must be greater than or equal to zero and less than the size of the argument list."); 
       } 
      } 
      while (i < valueArr.Length) 
      { 
       Console.Write(valueArr[i]); 
       i++; 
      } 
      Console.WriteLine(); 
     } 
    } 
} 

、出力は以下のようになります。 enter image description here

+1

これは '" Hello、{{1}} {0} "'という形式の文字列で失敗します。最初のパラメータが "Joe"の場合、期待される出力は 'Hello、{1} Joe'です。あなたのコードは '{'と '}'リテラルを扱いません。さらに、書式文字列も処理しません。たとえば、文字列が "Hello {0:P2}"の場合最後に、正規表現 '' {[0-9] *} ''を使用すると、文字列 '' {} ''が存在すれば失敗することになります。最初の桁のみを解析しているため、10個以上の文字列(例: '{10}')があると、コードも失敗します。要するに、この実装には完全な穴があります。 –

+0

"{{1}}"、 "{}"、 "{10}"の回答を更新しました。質問では、フォーマット文字列の使用については何もなかった。私のコードがそれを処理しているとは言いませんでした。 –

+0

あなたの修正が実際に "{{1}}"の問題を修正するとは思わない。あなたは引き続き "{1}"を意図した動作ではない引数で置き換えようとしているようです。実際にコードをテストしましたか?そして、いいえ、OPはフォーマット文字列について何も言わなかったが、それは "writeline with color"メソッドで期待するのが妥当なものだった。 –

0

私はstring.Formatはあなたが期待しているかという能力を持っている、とは思いません。

ただし、サブストリングを使用して機能をカスタマイズできます。

私は以下の機能を試してみました。 私はあなたの期待に近い出力を見る。以下のコードのコメントを見てください。文字列入力用のサンプル。オブジェクト配列の場合、コードの2番目の部分を少しスクロールします。

 public void ColorToConsole(ConsoleColor c, string s, string p) 
     { 
      //GET THE SUBSTRING TILL {0} AND WRITE IT TO CONSOLE 
      string substr = s.Substring(0,s.IndexOf("{0}")); 
      Console.Write(substr); 

      //NOW SET THE FORE GROUND COLOR. WRITE THE REST 
      Console.ForegroundColor = c; 
      Console.Write(p); 
     } 

あなたは色違いでごpの各要素をしたい場合は、以下のコードを試すことができます。

Console.ForegroundColor = ConsoleColor.Blue; 
Console.Write(p[0]); 

//RESET THE COLOR. 
Console.ResetColor(); 

Console.ForegroundColor = ConsoleColor.Red; 
Console.Write(p[1]); 
関連する問題