Привет всем!
В данной статье я решил привести пример реализации бегущей строки на C#.
Суть заключается в том, чтобы выводить последовательно определенное количество символов из переменной string.
Для этого я использовал структуру
GetText 
поместив в неё переменные и методы для работы с бегущей строкой.


 public GetText(int TEXTLENGHT)
            {
                //размер возвращаемого текста должен включатькак минимум 1 символ
                if (TEXTLENGHT > 0)
                {
                    lenght = TEXTLENGHT;
                }
                else if (TEXTLENGHT < 0)
                {
                    lenght = 0 - TEXTLENGHT;
                }
                else
                {
                    lenght = 1;
                }
                max = lenght;
            }
            public int lenght { get; }//переменная хранящея значение количества возвращаемых символов
            public static string Text;
            public static string outText;
            private static int min = 0, max;  

Переменные Text и outText используются для хранения входного и выходного текста. Выходным тестом являются элементы массива Text расположенные в диапозоне от min до max.
Length в данной структуре хранит количество элементов от min до max и задается при инициализации структуры.

 public void Initialize()
            {
                min = 0;
                max = lenght;
                wpered();
            }
            public void Initialize(string TEXT)
            {
                Text = TEXT;
                min = 0;
                max = lenght;
                wpered();
            }

Метод Initialize необходим для задания исходного текста и возврата переменных min и max в исходное состояние.

private char[] CharPosl(char[] input, int min, int max)
            {
                int lenght = max - min;
                char[] r = new char[lenght];
                int counter = 0;
                for (int i = min; i < max; i++)
                {
                    r[counter] = input[i];
                    counter++;
                }
                return r;
            }

Метод CharPosl возвращает в массиве последовательность символов расположенных в промежутке от min до max.

private void WriteT(char[] t)
            {
                string o = "";
                for (int i = 0; i < t.Length; i++)
                {
                    o += t[i].ToString();
                }
                outText = o;
            }

Данный метод записывает массив символов в выходной текст.

            public void wpered()
            {
                if (Text != "")
                {
                    char[] sim = GetMas(Text);
                    if (sim.Length >= lenght)
                    {
                        WriteT(CharPosl(sim, min, max));
                        min++;
                        if (max++ >= sim.Length)
                        {
                            max--;
                            min--;
                            Initialize();//возврат в стартовое положение
                        }
                    }
                    else { WriteT(Text); }
                }
            }
            public void nazad()
            {
                if (Text != "")
                {
                    char[] sim = GetMas(Text);
                    if (sim.Length > lenght)
                    {
                        WriteT(CharPosl(sim, min, max));
                        max--;
                        if (min-- <= 0)
                        {
                            max = sim.Length - 1;
                            min = max - lenght;

                            //отправится в конец текста
                            WriteT(CharPosl(sim, min, max));
                        }
                    }
                    else { WriteT(Text); }
                }
            }
            private char[] GetMas(string t)
            {
                return t.ToCharArray();//вернуть массив символов
            }

Методы wpered и nazad изменяют значение переменных min и max сдвигая тем самым номер начального и конечного элемента переменной Text. В случае если условие
if (Text != "")
не соблюдается, то есть входной текст является пустым, метод возвращает исходный текст не изменяя значения переменных. В случае, если стартовый индекс меньше 0
  if (min-- <= 0)
                        {
                            max = sim.Length - 1;
                            min = max - lenght;

                            //отправится в конец текста
                            WriteT(CharPosl(sim, min, max));
                        }

значение переменных min и max становится максимальным и возвращаются последние элементы текста, в случае когда увеличения значения переменной max выйдет за границы массивы, осуществляется возврат на стартовую позицию.
public string ReturnText()
            {
                return outText;
            }

Метод ReturnText возвращает конечный текст.
Далее приведён метод, демастрирующий возможности структуры.
static void Main(string[] args)
        {
            string   t = "Приложение бегущей строки. Текст будет перемещатся в окне консоли.";//начальный текст который будет перемещатся
            GetText text = new GetText(12);//инициализация структуры с указанием количества выходных элементов
            text.Initialize(t);//отправка текста в структуру
            int i = t.Length;
            for(int counter = 0; counter < i; counter++)
            {
                Console.SetCursorPosition(12, 4);//установка положения курсора чтобы текст был на 1 строке
                Console.Write(text.ReturnText());
                text.wpered();
                System.Threading.Thread.Sleep(300);//Приостановка потока необходима для того, чтобы было видно что текст движестся
                Console.Clear();//очистка экрана консоли
              
            }
            int key;
            while ((key = (int)Console.ReadKey().Key) != 27)//Выключение при нажатии клавиши Esc
            {
                //Перемещение текста по нажатию клавиши клавиатуры
                if (key == 39)
                {
                    Console.SetCursorPosition(12, 6);
                    text.wpered();//перемещение на следующий символ
                    Console.Clear();
                    Console.Write(text.ReturnText());
                }
                if (key == 37)
                {
                    Console.SetCursorPosition(12, 6);
                    text.nazad();//перемещение на предыдущий символ
                    Console.Clear();
                    Console.Clear();
                    Console.Write(text.ReturnText());
                }
            }
        }

Всем спасибо за внимание.