Autor Beitrag
WildRover
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mo 01.08.16 10:24 
Hallo zusammen,
ich habe folgende Aufgabenstellung und würde von euch gern erfahren, wie sich das lösen lassen könnte (prinzipielle Vorgehensweise ohne Code würde schon reichen):
Ich habe 2 Listboxen mit jeweils 10 statischen Inhalten (Strings). Nach Auswahl jeweils eines Eintrages in den beiden Listboxen soll ein dynamisches String-Array erzeugt werden, das in Abhängigkeit der beiden SelectedListItems bestimmte String-Elemente enthalten soll (also nicht einfach die 2 ausgewählten Strings, sondern andere Strings, die vorher für alle denkbaren Kombination festgelegt wurden).
Wie würdet ihr das lösen? Vielen Dank schonmal.
GeraldVonRiva
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19
Erhaltene Danke: 2



BeitragVerfasst: Mo 01.08.16 11:01 
Hallo,

wenn ich das richtige Verstehe, sind deinen Listboxen "Keys" enthälten. Diese kann der Nutzer auswählen und jeder "Key" liefert dann später unterschiedliche Werte mit? Wenn das so ist könntest du dir mal ein "Dictionary" anschauen.

mfg

Gerald
WildRover Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mo 01.08.16 12:10 
Hallo,
in meinem momentanen Entwurf sind in den Listboxen lediglich Texteinträge enthalten, über WinForms als Auflistung erstellt.
Konkret: Die erste Listbox enthält als Strings die musikalischen Stammnoten, also C, D, usw. und die zweite Listbox als Strings die Namen diverser Akkordformen. Der User wählt also z.b. "C" als Stammton und "Dur" als Akkordform aus. Aus diesen Angaben soll ein Algorithmus die enthaltenen Töne ermitteln (hier also "C", "E", "G") und ein neues String-Array erstellen, dem diese Strings als Elemente zugeordnet werden. Dieses Array wird dann für weitere Aktionen verwendet.
Bei neuerlicher Auswahl des Users wird dann entsprechend ein anderes Array erstellt.

Mit Keys habe ich bisher noch nichts zu tun gehabt, vielleicht ist das aber auch eine Möglichkeit...
C#
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: Mo 01.08.16 13:24 
Hallo und :welcome:

Keys können durchaus strings sein. Ein Key beschreibt ja nur einen eindeutigen Schlüssel. Welchen Typ dieser Schlüssel hat ist offen, in deinem Fall wäre aber ein string als Schlüssel angebracht.

Ein Dictionary - wie unser The Witcher Freund schon angesprochen hat - wäre hier durchaus eine Möglichkeit. Ein Dictionary (Wörterbuch) ist eine Liste von Schlüssel-Wert-Paaren. Jeder Schlüssel ist einem bestimmten Wert zugeordnet. Wichtig hierbei ist, dass der Schlüssel immer eindeutig sein muss, d.h. du kannst keine zwei Einträge mit dem selben Schlüssel in einem Dictionary haben (für weitere Infos zu Dictionary verweise ich auf die Doku von MSDN).

In deinem Fall würde ich das jetzt so angehen, dass dein Schlüssel sich immer aus den beiden ausgewählten Einträgen zusammensetzt, z.B. "CDur", "FDur", "Asus4". Da diese Verkettungen (man nennt das auch Konkatenation) eindeutig sind, d.h. keine Kombination doppelt vorkommt, eignen sie sich wunderbar als Schlüssel für dein Dictionary.
Nun legst du dir dein Dictionary mit den entsprechenden Schlüsseln und Werten an:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
    private Dictionary<stringstring[]> chords = new Dictionary<stringstring[]>
    {
      //Schlüssel         Wert
      //(string)       (string[])
      {"CDur"new string[] {"C""E""G" }},
      {"DDur"new string[] {"D""F#""A" }},
      // ...
    };


Danach musst du nur noch über den passenden Schlüssel auf die Werte zugreifen:
ausblenden C#-Quelltext
1:
2:
3:
4:
      //     CDur                   C                                 Dur
      string chord = ListBox1.SelectedItem.ToString() + ListBox2.SelectedItem.ToString();
      //        {C, E, G}           CDur
      string[] chordTunes = chords[chord];

Die Variable chordTunes enthält dann das gewünschte Array.

Nebenbei: Akkorde kann man auch berechnen (siehe hier).

_________________
Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler

Für diesen Beitrag haben gedankt: WildRover
WildRover Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mo 01.08.16 13:49 
Hallo,

die Lösung mit Keys ist ja super. Wie gesagt, Keys sind mir bisher fremd gewesen. Aber so kann ich mit relativ wenig Code alles abbilden, was ich brauche. Zumal in einem weiteren Ausbau ja auch noch Skalen und Intervalle dazukommen.

Möchte nicht wissen, wie oft das Rad aus Unwissenheit neu erfunden wird...

Nochmal vielen Dank.
Schafschaf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 63
Erhaltene Danke: 2

Windows 10
C# (VS 2015)
BeitragVerfasst: Mi 03.08.16 17:19 
Wenn du noch mehr Akkorde hinzufügen möchtest, musst du ja für jeden einzelnen Akkord einen Eintrag in deinem Dictionary machen.
Das kann mit der Zeit mühsam werden.
An deiner Stelle würde ich eher ein Array erstellen mit allen Halbtönen drin und dann z.B. mit einem Dur-Algorithmus (der die Intervalle beinhaltet)
über das Array laufen und die passenden Töne ab deinem Stammton holen.