2015-06-16 37 views
1

我一直在想這一段時間,並保持回落的嵌套for循環和一堆如果/ Thens的...轉換的一個陣列內/上另一個固定大小的數組中從左側或右側

我我試圖在一行上爲LCD字符顯示創建文本滾動/滑入效果。我希望能夠將輸入起點和終點設置到數組中。例如,我有一個基本字節數組大小爲16,並且想要開始將數組移入/移入它。

輸出將是這樣的每行是被髮送到顯示陣列的一次迭代:


_______________ < -start與空白的陣列[16]
_____________H_ < -start轉移在在指定的開始位置,例如[14]
____________He_
___________Hel_
__________Hell_
_________Hello_
________Hello__
_______Hello___
______Hello____
_____Hello_____ <末端移作爲指定位置例如[5]

相反,我想是能夠移動這一點,像這樣:
_____Hello_____ < -Begining陣列< - 這需要創建
____Hello______
___Hello_______
__Hello________
_Hello_________
_ello__________
_llo___________
_lo____________
_o_____________
_______________

有沒有一種高效的方法可以做到這一點?我正在使用NetMF,因此對框架有一些限制。

腳註:我想這可以通過直接操作要顯示的字符串來完成,然後將其轉換爲字節數組發送到顯示器,但我認爲這可能會更慢。

+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的位置或左邊界(結束如果x - leftEdge小於零,現在是時候計算了:1)我們應該爲SubString方法使用什麼樣的索引('hello world'),2)我們想提取多少個字符。

1)取決於:我們的x位置是否到達了左邊界? 不)我們從索引0開始
是的)我們從計數值開始。計數 - 是我們用於計算 我們的字段的字段

2)這取決於x對右邊界的位置。如果我們的x位置+文本字符串。長度不會超過我們想要的字符串的邊界。在其他情況下,我們應該計算有多少個字符在限制範圍內並提取它們。同樣,如果x - leftEdge < 0並且我們從count的索引開始 - 我們想從字符串長度中減去count值,所以我們只得到字符串的其餘部分並且不超過它。

enter image description here

+0

謝謝!這是我的代碼的一個偉大的開端!花了一點時間才能理解你在'line = ...'語句中做的所有事情。我修改並重寫了它,所以對我更加清楚......我還想知道是否有一些更高效的方法可以通過字節/字符數組來完成 – GisMofx

+0

String只是一個char數組,因此您可以像使用任何數組一樣使用它使用LINQ。但是LINQ在性能方面相當慢。它創建的原因是提供簡單的'即時'語言,用於查詢任何數據源(如DBS或集合(或數組))的任何來源。這就是爲什麼它很慢。這不是你的情況中最好的選擇。 – Fabjan

+0

編輯我的答案並解釋我使用的算法 – Fabjan

相關問題