2015-06-16 1 views
1

Я думал об этом некоторое время, и продолжают падать обратно на вложенные Для Loops и кучу If/Thens ...Shifting один массив в/на другой фиксированный размер массива влево или вправо

I Я пытаюсь создать эффект прокрутки текста/слайд-эффекта для отображения символа ЖК-дисплея в одной строке. Я хотел бы иметь возможность установить начальную точку ввода и конечную точку в массив. Например, у меня размер базового байтового размера 16 и вы хотите начать смещение массива в/в него.

Выход бы что-то подобное с каждая линия итерация массива, который посылается на дисплей:

<
_______________ -start с пустым массивом [16]
_____________H_ < -start сдвиг в в указанной начальной позиции, например [14]
____________He_
___________Hel_
__________Hell_
_________Hello_
________Hello__
_______Hello___
______Hello____
_____Hello_____ < -end смещается в заданное положение, например, [5]

С другой стороны, я хотел бы иметь возможность переложить на это так:
_____Hello_____ < -Begining массив < -Этот должен быть создан
____Hello______
___Hello_______
__Hello________
_Hello_________
_ello__________
_llo___________
_lo____________
_o_____________
_______________

Есть ли эффективный/родной способ сделать это? Я использую NetMF, поэтому есть некоторые ограничения для структуры.

footnote: Я предполагаю, что это может быть сделано путем непосредственного манипулирования строкой, которая будет отображаться, а затем преобразую ее в массив байтов для отправки на дисплей, но я думаю, что это может быть медленнее.

+0

Там, может быть, некоторые важные идеи здесь: http://stackoverflow.com/questions/2381245/c-sharp-quickest-way-to-shift-array – PaulF

+0

Thanks..I've прочитал, что перед публикацией этого, но я до сих пор не совсем понял, как применить это к моему делу, пока еще ... работаю на нем. – GisMofx

ответ

1
class Program2 
    { 
     static void AnimateString(int leftEdge, int RightEdge, int length, char fillWith, string text, int delay_ms) 
     { 
      int x = RightEdge; 
      string line = ""; 
      int count = 0; 
      string leftBorder = "";    

     while (true) 
     { 
      Console.CursorLeft = 0; 
      Console.Write(new String(fillWith, length)); 
      Console.CursorLeft = 0; 

      if (x < leftEdge) ++count;     

      leftBorder = new String(fillWith, x - 1 > leftEdge ? x - 1 : leftEdge);     

    line = leftBorder + text.Substring(x > leftEdge - 1? 0 : count, 
     x > leftEdge - 1 ? (x + text.Length > RightEdge ? RightEdge - x : text.Length) : text.Length - count); 
      Console.Write(line); 
      Thread.Sleep(delay_ms); 
      --x; 
      if (count >= text.Length) { x = RightEdge; count = 0; line = ""; } 
     }  
    } 

    static void Main() 
    { 
     string blank = new String('-', 32); 
     string text = "Hello world!"; 
     AnimateString(4, 20, 24, '-', "Hello world", 100); 

     Console.ReadKey(); 
    } 
} 

Проверить эту строку кода:

line = leftBorder + text.Substring(x > leftEdge - 1? 0 : count, 
      x > leftEdge - 1 ? (x + text.Length > RightEdge ? RightEdge - x : text.Length) : text.Length - count); 

Мы уже создали «левую часть» нашей строки - строка текста начинается с 0 и заканчивается либо с позиции х или левой границы (в случай, когда x - leftEdge меньше нуля. Теперь пришло время вычислить: 1) какой индекс в тексте («hello world») следует взять для метода SubString и 2) сколько символов мы хотели бы извлечь.

1) зависит от: имеет ли наша позиция x достигнута левая граница? нет) начинаем с индекса 0
есть) начинаем со счета. Граф - это наше поле, которое мы используем для расчета сдвиг влево в нашей текстовой строке

2) это зависит от положения x от правой границы. Если наша позиция x + текстовая строка.длина не превышает границ, которые мы будем использовать для этой строки. В другом случае мы должны подсчитать, сколько символов находится в пределах и извлекать их. Также, если x - leftEdge < 0, и мы начали с индекса count - мы бы хотели вычесть значение count из длины строки, поэтому мы получаем только оставшуюся часть строки и не превышаем ее.

enter image description here

+0

Спасибо! Это отличный головокружение в моем коде! Потребовалось немного времени, чтобы понять все, что вы делаете в инструкции 'line = ...'. Я изменил и переписал его, чтобы мне было яснее ... Мне также было интересно, есть ли еще более эффективный способ выполнить это с помощью массивов byte/char. – GisMofx

+0

String - это только массив символов, поэтому вы можете работать с ним, как с любым массивом используя LINQ. Но LINQ значительно медленнее с точки зрения производительности. Причина, по которой он был создан, - обеспечить легкий язык «на лету», который используется для запроса любого источника ienumerable данных, таких как Dbs или Collections (или Array). Вот почему это медленно. Это не лучший выбор в вашем случае. – Fabjan

+0

Отредактировал мой ответ и объяснил используемый мною алгоритм – Fabjan