mikrocontroller.net

Forum: PC-Programmierung C# -- Wie speichere ich am Besten Daten die während der Laufzeit anfallen?


Autor: Marco K. (mbc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Leuts

Ein absoluter Beginner hat ein kleines Problem.

Ich möchte während der Laufzeit verschiedene Dateien überprüfen und 
diese Ergebnisse im Speicher festhalten.

Dafür habe ich mir eine Klasse erstelle welche über entsprechende 
Properties die Daten annimmt und festhält.

Mein Problem nun besteht nun darin, wie ich diese während der Laufzeit 
erzeugte Klasse benennen kann und wieder gezielt abrufen kann.

Ich würde die Klasse am liebsten nach dem Dateinamen benennen und damit 
dann später auch wieder drauf zugreifen können.

Ich konnte jedoch kein NOOB-freundliches Tutorial oder eine Erklärung 
dazu finden, zudem ich überhaupt nicht weis, ob es dafür sogar einen 
Fachbegriff gibt unter dem das zu finden wäre.

Hat jemand einen Tip?

MFG
Marco

Autor: Gs Scarnight (gs-scarnight)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du erzeugst keine Klassen dynamisch sondern du instanzierst diese. Schau 
dir mal das Konzept der HashMap an. In dieser werden jeweils Wertepaare 
gespeichert: ein eindeutiger Schlüssel (z.B. dein Dateiname) und dann 
der zu dem Schlüssel gehörige Wert (hier dein erzeugtes Objekt).

Hier findest du ein kleines BSP, damit kannst du dann selbst 
weitergooglen 
http://www.microsoft.com/mspress/books/sampchap/61...

Autor: Arc Net (arc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stichwort: Serialisierung/Deserialisierung
   
    // die folgende Klasse soll serialisierbar sein, also Attribut
    [Serializable] 
    public class Data {
        int mXYZ = 0;
        public int XYZ {
            get { return mXYZ; }
            set { mXYZ = value; }
        }
    }

    // soll's nicht als XML, sondern in einem Binärformat 
    // geschrieben werden kann man XmlSerializer z.B.
    // durch BinaryFormatter ersetzen

    // alles ohne Fehlerbehandlung...
    void writeXML(string fileName, object o) {              
        XmlSerializer xs = new XmlSerializer(o.GetType());
        FileStream fs = File.Create(fileName);
        xs.Serialize(fs, o); 
        fs.Close(); 
    }
    
    object readXML(string fileName, Type t) {
        XmlSerializer xs = new XmlSerializer(t);
        FileStream fs = File.OpenRead(fileName);
        object o = xs.Deserialize(fs);
        fs.Close();
        return o;
    }

    // benutzen kann man das z.B. so
    Data dat = new Data();
    Data dat2;

    dat.XYZ = 123;

    writeXML("test.xml", dat);
    dat2 = readXML("test.xml", typeof(Data)) as Data;

    // generisch geht's auch etwas eleganter
    public class ObjSerDes {
        public static void WriteXML<T>(string fileName, T o) {
            XmlSerializer xs = new XmlSerializer(typeof(T));
            FileStream fs = File.Create(fileName);
            xs.Serialize(fs, o);
            fs.Close();     
        }

        public static T ReadXML<T>(string fileName) {
            XmlSerializer xs = new XmlSerializer(typeof(T));
            FileStream fs = File.OpenRead(fileName);
            T o = (T)xs.Deserialize(fs);
            fs.Close();
            return o;
        }
    }

    ObjSerDes.WriteXML<Data>("test2.xml", dat);    
    dat2 = ObjSerDes.ReadXML<Data>("test2.xml");

Autor: Marco K. (mbc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich danke Euch für die Antworten. Ist erstmal wieder reichlich zum 
googeln. Aber wenigstens weis ich jetzt in welcher Richtung ich suchen 
muß.

Die Hashtable scheint mir dabei etwas NOOB-freundlicher zu sein.
Wenn ich da jetzt auch im "Value-Bereich" direkt auf die Classproperties 
zugreifen kann ist das genau das was ich suche.

MFG
Marco

Autor: Chris ... (dechavue)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

Noch als Info am Rande:
Verwende ab .Net 2.0 die Hashtable NICHT mehr.
Verwende stattdessen die generische Klasse Dictionary<K,V>, ist 
typsicher, performanter & leichter anzuwenden(man spart sich die Casts).
Die Hashtable existiert meines Wissend nur noch aus 
Kompatibilitätsgründen.

greets

Autor: Marco K. (mbc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank

Obwohl ich gestern den ganzen Tag mit der Hashtable verbracht habe (ja, 
als NOOB dauert das so lange) konnte ich diesen Hinweis nicht finden.

Ein Problem besteht aber noch:

Ich muß für jede meiner zu untersuchenden Datei ja eine eigene Instanz 
der selbstgeschriebenen Klasse instanzieren und diese dann dem Dictonary 
unter einem bestimmten Key (dem Dateinamen) ablegen.

Ich habe probleme damit dieses, sowie auch den Zugriff auf die 
Properties der einzelnen Klassen zu erlangen, bzw. weis nicht wie das 
gehen sollte.

Was mir einfiel wäre dies hier:

Ich ermittele die Anzahl aller Dateien (hier als Beispiel 12 Stück) die 
zu analysieren sind und erzeuge ein Class-Array im Sinne von:
 myclass [] test = new myclass[12];

Dann muß ich wie ich gelesen habe die Klassen einzeln instanzieren durch 
eine Schleife:
 test[i] = new myclass(); 

Damit "hätte" ich nun 12 Klassen in einem Array.

Mit einer weiteren Schleife würde ich nun die Dateinamen mit einer 
Klasse aus dem Array verbinden und das in dem Dictionary speichern.
 myStringDict.Add("DATEINAME als STRING", test[1]); 

Und dann stecke ich fest ... wie komme ich nun an die Properties meiner 
Klasse in test[1] ?

Vermutlich ist das hier alles völliger Schwachsinn, aber anders wüßte 
ich nicht weiter. Damit ich es verstehe müßte es halt so simpel wie 
möglich sein, auch wenn es nicht die 100%ig beste Möglichkeit wäre.

Geht das so überhaupt, bzw wie kann man es besser machen ?
Ich müßte ja die einzelnen Eigenschaften meiner Klasse einzeln auslesen 
und abändern können, z.B:

test[1].EIGENSCHAFT1 = "WERT"
test[1].EIGENSCHAFT2 = "WERT"

MFG
Marco

Autor: Arc Net (arc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
    // Anlegen des Dictonaries
    Dictonary<string, myclass> dict = = new Dictionary<string, myclass>();

    // neue Instanz bzw. Schlüssel/Wert-Paar hinzufügen
    dict.Add(fileName, new myclass());

    // Zugriff
    dict[fileName].Eigenschaft1 = 1234; 

    // wenn nacheinander auf alle Einträge im Dictonary zugegriffen 
    // werden muss, geht's z.B. so
    foreach (KeyValuePair<string, Data> kvp in ds) {
         kvp.Value.Eigenschaft1 = 5678;
    }    

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.