2016-05-22 24 views
1

So sorry für diese vage Frage ... seine tun meinen Kopf in ...C# Inkrement Dekrement Listenwerte

Im Grunde nur ein Testprojekt, verwenden Sie die Taste [+] eine Reihe von Werten in die Liste hinzufügen .... Die Pfeiltasten müssen nach oben und nach unten gehen. Die Listenwerte ...

Wenn der Liste ein neuer Wert hinzugefügt wird, wird "historySelected" zurückgesetzt, so dass der "Pfeil nach oben" immer selektiert das letzte Element, das zuerst in der Liste hinzugefügt wurde, und dann, wenn Sie es weiter gedrückt halten, geht es durch die Listenwerte zurück. Immer wenn die 'Pfeil nach unten' Taste gedrückt wird, muss zum vorherigen Wert in der Liste der Werte zurückgegangen werden. Zu keinem Zeitpunkt sollte eine Nach-oben-Taste, gefolgt von einer Nach-unten-Taste den gleichen Listenwert anzeigen und umgekehrt.

Das Verhalten, das ich suche, ist ähnlich wie eine Entwicklerkonsole mit einem Befehlsverlauf, wobei Pfeil nach oben geht weiter zurück in der Geschichte, und Down-Pfeil das Gegenteil.

Nochmals Entschuldigungen für den Code, es war durch so viele Teständerungen, derzeit funktioniert dies Pfeil nach oben zum Anfang des Wertes Liste, und dann mit dem Pfeil nach unten, um alle zurück zum höchsten Index Liste gehen .. Aber das Problem ist, wenn du halb durch die Liste gehst (oder zwischendurch), und vom Pfeil nach oben in den Pfeil nach unten gehst .. die Werte inkrementieren/dekrementieren nicht entsprechend ... Ich kann nicht scheinen Holen Sie sich die richtige Codelogik dafür.

Jede Hilfe oder Vorschläge danke.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace ArrowKeys { 
    class Program { 

     //public static List<string> cmdHistory = new List<string>() { "1", "2", "3", "4", "5" }; 
     public static List<string> cmdHistory = new List<string>(); 
     public static int cmdHistoryCount = 0; 
     public static int historySelected = 0; 
     public static int num = 0; 
     public static string current = ""; 

     public enum UpDown { 
      reset, 
      up, 
      down 
     }; 

     public static UpDown LastUpDown; 

     static void Main(string[] args) { 
      bool running = true; 
      while (running) { 
       ConsoleKeyInfo kb = Console.ReadKey(); 
       switch (kb.Key) { 
        case ConsoleKey.Escape: 
         Console.WriteLine("Exit"); 
         running = false; 
         return; 
        case ConsoleKey.Add: 
         cmdHistory.Add(num.ToString()); 
         cmdHistoryCount++; 
         historySelected= cmdHistoryCount; 
         LastUpDown = UpDown.reset; 
         Console.WriteLine(string.Join(" ", cmdHistory.Cast<string>().ToArray())); 
         num++; 
         break; 
        case ConsoleKey.UpArrow: 
         UpArrow(); 
         LastUpDown = UpDown.up; 
         Console.WriteLine("UpArrow pressed"); 
         Console.WriteLine(current); 
         break; 
        case ConsoleKey.DownArrow: 
         DownArrow(); 
         LastUpDown = UpDown.down; 
         Console.WriteLine("DownArrow pressed"); 
         Console.WriteLine(current); 
         break; 
       } 
      } 
     } 

     public static int Clamp(int value, int min, int max) { 
      return (value < min) ? min : (value > max) ? max : value; 
     } 

     public static void UpArrow() { 
      if (cmdHistoryCount != 0) { 
       if (LastUpDown == UpDown.down) { 
        if (historySelected - 1 == 0) { 
         return; 
        } 
       } 
       current = cmdHistory[historySelected - 1]; 
        if (historySelected - 1 == 0) { 
        return; 
        } 
        historySelected--; 
      } 
     } 

     public static void DownArrow() { 
      if (cmdHistoryCount != 0) { 
       if (LastUpDown == UpDown.up) { 
        if (historySelected + 1 > cmdHistoryCount) { 
         return; 
        } 
       } 
        current = cmdHistory[historySelected - 1]; 
        if (historySelected + 1 > cmdHistoryCount) { 
         return; 
        } 
        historySelected++; 

      } 
     } 
    } 
} 
+0

'Zu keinem Zeitpunkt sollte eine Nach-oben-Taste, gefolgt von einer Nach-unten-Taste den gleichen Listenwert anzeigen, und umgekehrt ..' Ich verstehe nicht Ihr Radfahren Verhalten ... Wenn oben in der Geschichte und nach unten geht geht weiter (wie eine Konsole), wenn ich dann nach oben und dann nach unten drücke, gehe ich zwangsläufig auf den gleichen Wert zurück ... Was ist der Dreh? –

+0

Diese beiden Aussagen scheinen völlig widersprüchlich zu sein: * "Immer, wenn die" Abwärtspfeil "-Taste gedrückt wird, muss auf den vorherigen Wert in der Werteliste zurückgegangen werden" "Zu keinem Zeitpunkt sollte eine Aufwärtspfeiltaste gefolgt von einem Abwärtspfeil folgen Taste zeigen den gleichen Listenwert "* –

+0

0,1,2,3,4,5 Wenn der letzte angezeigte Wert 2 war.Dann sollte UpArrow zu 1 als nächstes gehen, wenn Sie stattdessen DownArrow gedrückt haben, dann sollte es zu 3 gehen. Wenn Sie UpArrow zum Start gedrückt haben, wo es wiederholt 0, und die DownArrow drücken sollte es gehen 1. Und wenn Sie weiter gedrückt DownArrow bis zum Ende 5, und dann gedrückt UpArrow sollte es gehen 4. Die Sachen, die ich versucht habe, war gerade nicht alles richtig. Entschuldigung für die Konfusion, der Code, den ich postete, war etwas kaputt. – NestedCodeblocksFTW

Antwort

0

Es hört sich so an, als müssten Sie Ihren Index einfach außerhalb des zulässigen Bereichs halten. Es ist nicht klar, was der bestehende Code tun sollte, aber Ihre Klarstellung scheint zu implizieren, dass es nicht notwendig ist. Versuchen Sie dies:

public static void UpArrow() 
{ 
    historySelected = Math.Max(0, historySelected - 1); 
    current = cmdHistory[historySelected]; 
} 

public static void DownArrow() 
{ 
    var maxIndex = cmdHistory.Count - 1; 
    historySelected = Math.Min(maxIndex, historySelected + 1); 
    current = cmdHistory[historySelected]; 
} 
+0

Das funktioniert! : D (Nun, ich habe das if (cmdHistory.Count! = 0) {} darum hinzugefügt, um zu verhindern, dass der Index außerhalb des Bereichs liegt, wenn die Zählung 0 war) .. aber verdammt habe ich es komplizierter ... zurückblickend denke ich, dass ich es geschafft habe in der Nähe davon, für UpArrow Ich erhöhte die historySelected ++; dann mit Clamp, und schließlich den Wert für UpArrow, und das Gegenteil mit Down .. aber etwas war in, wie ich es tat. Ich denke, ich hasse es einfach, mit Längen und Zählungen umzugehen, wenn man immer 1 subtrahieren muss, um sie für Indizes zu benutzen, es scheint mich völlig zu verscheuchen, wenn ich sie benutze. – NestedCodeblocksFTW

0

Wenn ich verstehe, was Sie richtig suchen, könnte ein Paar Duellstacks für Ihren Fall funktionieren. Sie werden Ihnen den gesuchten FILO/LIFO-Style-Zugriff geben. Löschen Sie die Liste und so etwas wie:

var UpStack = new Stack<string>(); 
var DownStack = new Stack<string>(); 

Ein "neues Element"

UpStack.Push(newItem); 

On "Up"

DownStack.Push(UpStack.Pop()); 

Auf "Down"

UpStack.Push(DownStack.Pop()); 

Wenn Sie wollten ein "Puffer" -Element, das sich nicht in einem der Sta befindet cks, das ist einfach genug, indem Sie einfach in den Puffer-Artikel pischen. Es ist ein wenig mehr Management, weil Sie es auf einen Stapel schieben müssen, dann den anderen jedes Mal knallen, aber es ist was auch immer. Es gibt auch die Peek() -Methode, die das Element auf einen Stapel ohne Popping bringt, so dass Sie es auch für Ihr Anzeigeelement verwenden.

Verwandte Themen