2013-05-15 2 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 раз в консоли замедляет меня. Я попытался использовать только 1 команду записи с помощью \ n, но мне нужно отложить следующую строку без стирания внутри отступов.

+0

Ну, конечно, это медленнее, у вас есть гораздо больше вызовов 'Write' здесь. Что вы можете сделать, так это создать одну строку с новыми строками и попробовать сразу же на консоль. Я не знаю, что подразумевалось, говоря, что вы можете делать это быстрее, используя массивы, но, вероятно, не то, что вы понимаете. – Pako

+0

Вы можете использовать 'StringBuilder' для создания всей строки (или всего вывода) и вывести ее на экран в своем цельность. – Davio

+0

Или вы можете попробовать что-то вроде примера 2 по этой ссылке: http://www.dotnetperls.com/convert-string-byte-array, похоже, использует массивы, но все возвращается к выведению одной строки на консоль вместо много – Pako

ответ

1

I Minimized 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(); 
      } 
     }