Laden...

Codebeispiel modifizieren (Vorschläge?)

Letzter Beitrag vor 13 Jahren 9 Posts 1.706 Views
Codebeispiel modifizieren (Vorschläge?)

Hallo Community!

Ich habe in einem KeyUp Event einen Codeabschnitt, der auf mich den Eindruck macht, als ob man ihn eleganter gestalten könnte.

Habt ihr vielleicht eine Idee wie?

            
if (e.Key == Key.LeftCtrl) return;
if (e.Key == Key.A && e.KeyboardDevice.Modifiers == ModifierKeys.Control) return;
if (e.Key == Key.Down) return;
if (e.Key == Key.Up) return;
if (e.Key == Key.Left) return;
if (e.Key == Key.Right) return;
if (e.Key == Key.Enter) return;
if (e.Key == Key.LeftShift) return;
if (e.Key == Key.Tab) return;

Sinn der Sache ist das Filtern gewisser Tasten, bei denen nichts passieren soll

Gruss,
reloop

Da du sowieso returnst würd ich das in ein Statement zusammen fassen.

Bin mir nur noch nicht sicher wie genau, denn optisch würde es keinen Unterschied machen und sogar noch komplizierter aussehen.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

Hallo,

benutze HashSet<T>, initialisiert mit allen Tasten, die zu einem Abbruch führen.

Hey ujr,

danke für den Hinweis.

Habe es jetzt so gelöst:

            var hsKeys = new HashSet<Key>
                             {
                                 Key.LeftCtrl,
                                 Key.Down,
                                 Key.Up,
                                 Key.Left,
                                 Key.Right,
                                 Key.Enter,
                                 Key.LeftShift,
                                 Key.Tab
                             };
            if (hsKeys.Any(hsKey => hsKey == e.Key))
            {
                return;
            }

Gibt es einen grundlegenden Unterschied wieso du zum HashSet und nicht zur List tendiert hast?

Gruss,
reloop

Hallo reloop,

du musst ja spezifizieren, dass bei bestimmten Eingeben nichts passieren soll. Weil du das Verhlaten haben möchtest, musst du es ja irgendwie angeben. Dir bleibt wohl nichts anderes übrig. Was du noch machen könntest, wäre, dass du alle Eingeben außer XY behandelst. Bei dem "außer" führst du dann ein return; aus.

zero_x

Hallo,

vewende nicht die Any-Erweiterungsmethode - im worst case ein O(n) - sondern die Contains-Methode des HashSet - ist ein O(1)-Vorgang und somit effizienter. Darum auch keine List<T>.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"


       private bool IsOneOf(Keys myKeyCode, params Keys[] mylist)
       {
           return mylist.Contains(myKeyCode);
       }

       private void ListDiagnosis_KeyUp(object sender, KeyEventArgs e)
       {
           if(IsOneOf(e.KeyCode, Keys.A, Keys.L, Keys.I, Keys.E, Keys.N))
             return;
       }

Ok, war zu langsam 😃

Erledigt!

Eine Frage noch, zum persönlichen Verständnis:

List<T1> besitzt doch auch eine Methode Namens "contains". Der Unterschied zwischen den Beiden war für mich bisher noch nicht ersichtlich.

Danke für eure Hilfe,
reloop

@bSharp:

deine Version ist noch schlimmer als die Version mit der list<T>.

Hier ist die einzig korrekte Lösung mit HashSet oder Dictionary zu suchen, da diese Überprüfung normalerweise häufig durchgeführt wird.

List<T1> besitzt doch auch eine Methode Namens "contains". Der Unterschied zwischen den Beiden war für mich bisher noch nicht ersichtlich.

siehe: [Übersicht] .NET Framework 2.X Auflistungen (Collections)