Suche bestimmten Datentyp / Objekt



  • Hallöle

    ich habe vier Arrays mit diversen Werten drin. Eines davon, nennen wir es arrayA hat die Werte in der Usprungssprache gespeichert.

    arrayB, C, und D beinhalten die Werte in anderen Sprachen.

    Nun möcht ich ein Mapping erstellen welche die einzelnen Werte aus B, C und D mit dem entsprechenden Wert aus A verbindet.

    Mein Vorschlag ist, drei Hashtables zu nutzen wo der Key jeweils der Wert aus arrayA und der Value der Wert aus einem der fremdsprachigen Arrays ist.

    Da meine Erfahrung diesbezüglich nicht wirklich gegeben sind wollte ich hier fragen ob dies der richtige Ansatz ist, oder ob ich vlt. einen anderen Datentyp verwenden könnte welcher gleich alle 3 in Einem mappen könnte. 😕

    Tips und Anregungen herzlich Willkommen 🙂

    Grüsse guest10111110



  • Ein Hashtable mit einen Tripel statt 4 Arrays geht nicht? Oder in der Hashtable mappst du einfach im Tripel die indexe für die jeweiligen werte.



  • Tripel.. wieder etwas gelernt heute 🙂

    wenn ich mir das so anschaue ist das aber nichts anderes als ein auf 3 Variablen beschränktes struct!?

    ..aber klar hätt ich selbst drauf kommen müssen: Ich hab dann also den Originalwert als Key in der Hashtable und als value ein struct object.

    👍

    cheers guest10111110



  • Vielleicht bin ich da zu umständlich, aber ich habe mir bei sowas angewöhnt, eine Klasse zu schreiben, die Listen für die unterschiedlichen Informationsarten enthält und über Indexer-Methoden darauf zugreifen.

    Struct etc. haben soweit ich es einschätze nur dann Vorteile, wenn man sehr systemnah bzw. performant programmieren muss. Da Du aber im C# / .Net Forum postest gehe ich erst einmal nicht davon aus.

    Vielleicht kann ja einer von den Cracks mal was dazu posten, wie die beiden Konzepte im Vergleich zu bewerten sind, also Struct mit Arrays gegen eine Klasse mit Listen.

    Beste Grüße

    Solick



  • Hi

    ich habe nun die genannte Hashtable erstellt.
    Auf jedem Key, befindet sich ein struct:

    public MyMapping(string a, string b, string c) : this()
    {
      A = a;
      B = b;
      C = c;
    }
    

    Nun iteriere ich durch die HT:

    foreach (string strkey in myHashtable.Keys)
    {
      myStructs.Add((MyClass.MyMapping)myHashtable[strkey]);
    }
    

    Frage / Problem:
    wieso kann ich jetzt nicht via:

    myStructs[0].A;
    

    auf einen Wert A eines Structs zugreiffen!? 😕

    ..müsste meiner Ansicht nach gehen.. hab ich was übersehen?

    Grüsse guest10111110



  • guest10111110 schrieb:

    ..müsste meiner Ansicht nach gehen.. hab ich was übersehen?

    Ja, die Fehlermeldung, mit der der Compiler deine Konstruktion ablehnt.
    (und eventuell solltest du auch dazusagen, was sich hinter "myStructs" verbirgt)



  • guest10111110 schrieb:

    Frage / Problem:
    wieso kann ich jetzt nicht via:

    myStructs[0].A;
    

    auf einen Wert A eines Structs zugreiffen!? 😕

    ..müsste meiner Ansicht nach gehen.. hab ich was übersehen?

    Hast du 😉 Du arbeitest mit einem HashTable (ich denke du meinst HashSet<T>, oder?) und nicht mit einem Array oder einer anderen Datenstruktur, die nativ index-basierten Zugriff ermöglicht wie List<T>. Ein HashSet funktioniert über den HashCode der Objekte, die es enthält.



  • CStoll schrieb:

    guest10111110 schrieb:

    ..müsste meiner Ansicht nach gehen.. hab ich was übersehen?

    Ja, die Fehlermeldung, mit der der Compiler deine Konstruktion ablehnt.
    (und eventuell solltest du auch dazusagen, was sich hinter "myStructs" verbirgt)

    Hi CStoll

    Die Meldung ist "cannot resolve symbol 'A'"

    Hinter meinem Struct verbergen sich 3 Fremdsprachen. Der Key der Hashtable hat den Value des Wortes in der Ursprungssprache. Folgend ein Auszug wie ich die Hashtable deklariere:

    var myHashtable = new Hashtable();
    myHashtable.Add("Test1", new AttributeMapping("TestA", "TestB", "TestC"));
    

    mit "myStructs[0].A;" möchte ich also "TestA" erhalten.

    Gruss guest10111110



  • GPC schrieb:

    guest10111110 schrieb:

    Frage / Problem:
    wieso kann ich jetzt nicht via:

    myStructs[0].A;
    

    auf einen Wert A eines Structs zugreiffen!? 😕

    ..müsste meiner Ansicht nach gehen.. hab ich was übersehen?

    Hast du 😉 Du arbeitest mit einem HashTable (ich denke du meinst HashSet<T>, oder?) und nicht mit einem Array oder einer anderen Datenstruktur, die nativ index-basierten Zugriff ermöglicht wie List<T>. Ein HashSet funktioniert über den HashCode der Objekte, die es enthält.

    Hi GPC

    & danke für Deine Lösung. Ich muss sie zuerst noch ein paar mal lesen bevor ich sie verstehe 🙂 Bin leider noch nicht so der Kenner..

    Grüsse guest10111110



  • guest10111110 schrieb:

    mit "myStructs[0].A;" möchte ich also "TestA" erhalten.

    Nochmal: Was ist eigentlich "myStructs"? Ansonsten könntest du die Werte sicher auch direkt aus der Hash-Table rausziehen anstatt eine Hilfsstruktur zu verwenden, bei der noch dazu der Bezug zum Schlüssel verloren geht:

    if(myHashtable.Contains(wert))
      Console.WriteLine(myHashtable[wert].A);
    

    Ansonsten: sind die Member A, B und C eigentlich öffentlich verfügbar?



  • Hi

    habe gerade bemerkt, dass ich ja einen Account in diesem Forum habe. 🙂

    myStructs ist eine ArrayList.

    A, B, C sind public.

    Nun.. vlt. hab ich ja den völlig falschen Ansatz:
    Ich möchte halt im Fall A einfach Sprache A ausgeben. Im Fall B, Sprache B, etc.

    Das ganze wollte ich iterieren, da es ziemlich viele Werte sind.



  • Tja, jo, äh. Im Moment krankt das hier alles etwas an einer nicht so prallen Problembeschreibung :S

    Also nur zum Verständnis. Du hast Vokabeln in vier Sprachen vorliegen. Eine Sprache davon ist die, na ja - sagen wir Muttersprache dazu. Und die anderen sind die Fremdsprache. Diese willst du so ablegen, dass sie miteinander verknüpft sind.
    Also bspw: "Ja" als Muttersprachsvokabel und "Yes", "Oui", "Si" als Fremdsprachenvokabeln. Wirst du immer nur über die Muttersprachsvokabel auf die Fremsprachenvokabeln zugreifen - also von "Ja" auf "Yes" usw. - oder soll es auch möglich sein, von "Yes" wieder auf "Ja" zurückzukommen?



  • Hi GPC

    Es muss nur oneway sein.
    Allerdings muss ich beim ausgeben der Fremdsprache wissen, welches der originalWert (Muttersprache) ist, da ich "Yes" an der stelle ausgeben möchte, wo bei deutscher Sprache das "Ja" steht.



  • Dann folgender Vorschlag:

    class Translations {
        private Tuple<string, string, string> data;
    
        public Translations(string source, string en, string fr, string ital) {
            this.SourceLanguage = source;
            this.data = new Tuple<string, string, string>(en, fe, ital);
        }
    
        public string SourceLanguage {
            get;
            private set;
        }
    
        public string English {
            get { return this.data.Item1; }
        }
    
        public string French {
            get { return this.data.Item2; }
        }
    
        public string Italian {
            get { return this.data.Item3; }
        }
    }
    
    Dictionary<string, Translations> myDict = new Dictionary<string, Translations>();
    myDict.Add("Ja", new Translations("Ja", "Yes", "Oui", "Si"));
    
    string inFrench = myDict["Ja"].French;
    

    Der Vorteil daran ist, dass du über das Dictionary ruck-zuck an die Übersetzungen kommst. Und im Übersetzungsobjekt selbst ist die Originalsprache auch mit abgelegt. Du kannst jetzt natürlich nicht per myDict[0] drauf zugreifen, sondern per myDict["Ja"].
    Wenn du es flexibler gestalten willst, dann ersetze das Tuple durch eine List<string> oder etwas in die Richtung, dann kannst du variabel viele Übersetzungen speichern. Hängt aber vom Anwendungsfall ab.

    Btw. Kp ob das so kompiliert.. hab's einfach mal zusammengehackt. Außerdem brauchst du .NET 4.0 wegen dem Tuple. Wenn du nur 3.5 oder so hast, dann ersetze das Tuple einfach durch normale Properties. Für jede Sprache eins dann.


  • Administrator

    GPC schrieb:

    Außerdem brauchst du .NET 4.0 wegen dem Tuple. Wenn du nur 3.5 oder so hast, dann ersetze das Tuple einfach durch normale Properties. Für jede Sprache eins dann.

    Wieso überhaupt in dem Fall ein Tuple und nicht gleich 3 Membervariablen (bzw. Properties mit public get & private set) verwenden? Mich würde da mal deinen Gedankengang dahinter interessieren 🙂

    Grüssli



  • Dravere schrieb:

    GPC schrieb:

    Außerdem brauchst du .NET 4.0 wegen dem Tuple. Wenn du nur 3.5 oder so hast, dann ersetze das Tuple einfach durch normale Properties. Für jede Sprache eins dann.

    Wieso überhaupt in dem Fall ein Tuple und nicht gleich 3 Membervariablen (bzw. Properties mit public get & private set) verwenden? Mich würde da mal deinen Gedankengang dahinter interessieren 🙂

    Eigentlich gibt's keinen sinnvollen Grund dafür. Vmtl. hab ich's benutzt, weil am Anfang im Thread auch was von Tripel stand oder dachte, wenn man die Daten mal roh haben will. Tendentiell wäre es aber schöner, das in Properties umzuwandeln. Wäre auch weniger Schreibaufwand ^^

    Abgesehen davon mag ich Tuples eigentlich recht gerne, nur stört es mich, dass man immer nur Zugriff per Item1, Item2 usw. hat.. das ist so nichtssagend. Darum schreibe ich doch oft so kleine Klassen, die nur zwei, drei Member haben und als Datencontainer fungieren.


  • Administrator

    GPC schrieb:

    Abgesehen davon mag ich Tuples eigentlich recht gerne, nur stört es mich, dass man immer nur Zugriff per Item1, Item2 usw. hat.. das ist so nichtssagend. Darum schreibe ich doch oft so kleine Klassen, die nur zwei, drei Member haben und als Datencontainer fungieren.

    Wer macht das nicht? Ich habe regelmässig solche kleinen Datencontainer. Um ehrlich zu sein, kann ich gerade wegen dem Item1, Item2, usw. den Tupeln überhaupt nichts gutes abgewinnen. Von mir aus gesehen, sind das völlig sinnlose Klassen im .Net Framework. Da nehm ich ja noch lieber eine dynamic Variable, obwohl dies natürlich ebenfalls nicht sinnvoll ist, aber immerhin hat man sprechende Property-Namen.

    Grüssli


Anmelden zum Antworten