2013-05-15 145 views
1

我接受了一些將其轉換爲數字像這樣的5x7圖形表示的函數:更快的打印控制檯字符

Console.WriteLine(" ███ "); // byte: 0000 1110 
Console.WriteLine("█ █"); //  0001 0001 
Console.WriteLine("█ █"); //  0001 0001 
Console.WriteLine("█ █"); //  0001 0001 
Console.WriteLine("█ █"); //  0001 0001 
Console.WriteLine("█ █"); //  0001 0001 
Console.WriteLine(" ███ "); //  0000 1110 

有人告訴我,它可以使用字節數組來實現更快。 這基本上就是我所做的:

byte[] data = new byte[] { 14, 17, 17, 17, 17, 17, 14 }; 
BitArray bitData = new BitArray(data); 


int bitCounter = 0; 
foreach (bool bit in bitData) 
{ 
    if (bit) 
    Console.Write("█"); 
    else 
    Console.Write(" "); 
    bitCounter++; 
    if (bitCounter>7) 
    { 
    bitCounter=0; 
    Console.WriteLine(); 
    } 
} 

這是比什麼是開始,所以我不能用它慢。 任何人都可以告訴我更好的方法嗎?

更新: StringBuilder確實有幫助,但它會比我原來的代碼慢一點。它仍然基本上在控制檯中使用寫命令7次會減慢我的速度。 我試着用\ n使用1寫命令,但我需要縮進下一行,而不是在縮進空格內擦除。

+0

那麼,當然這是慢的,你有這麼多的'寫'調用。你可以做的是創建一個字符串,並嵌入新行,並嘗試立即將它放在控制檯上。我不知道什麼意思是說你可以更快地使用數組,但可能不是你理解的。 – Pako

+0

你可以使用StringBuilder來創建一個完整的行(或整個輸出),並將其輸出到其屏幕上整體。 – Davio

+0

或者你可以從這個鏈接嘗試類似於示例2的東西:http://www.dotnetperls.com/convert-string-byte-array它似乎在使用數組,但它都回退到輸出一個字符串到控制檯而不是很多 – Pako

回答

1

I最小化IO。以下是僅在最後使控制檯調用的版本。

 var stringBuilder = new StringBuilder(); 
     bitCounter = 0; 
     foreach (bool bit in bitData) 
     {     
      if (bit) 
       stringBuilder.Append("█"); 
      else 
       stringBuilder.Append(" "); 
      bitCounter++; 
      if (bitCounter > 7) 
      { 
       bitCounter = 0; 
       Console.WriteLine(stringBuilder.ToString()); 
       stringBuilder.Clear(); 
      } 
     }