Entwickler-Ecke
Basistechnologien - List<klassen> Problem... Komme nicht weiter
WSS-130 - Sa 09.02.13 00:12
Titel: List<klassen> Problem... Komme nicht weiter
Hi zusammen,
ich habe hier ein kleines Problem mit dem ich nicht weiterkomme. Ich habe eine Liste die Daten von verschiedenen Klassen enthällt. Ich möchte ein Teil zuerst einlesen und auf Grund der Verständis aus diesen Teilen den Letzten erzeugen.
Der Umgang mit einer List<string> ist soweit klar:
C#-Quelltext
1: 2: 3: 4: 5:
| List<string> test = new List<string>
test[3] = "verändert"; |
Nun ist also das dritte Elememnt der String-List "verändert".
Nun zu meinem konkreten Bsp:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75:
| class dbdataFlow { List<dataFlow> container = new List<dataFlow>();
public void ErzeugeFluss(string datasetName, ref dbSignInt myDbSignInt, ref dbMap myDbMap, ref dbSignExt myDbSignExt) { container.Add(new dataFlow(intSig,busSig, null));
ErzeugeMeta(container); } public void ErzeugeMeta(List<dataFlow> container) { for (int i= 0, i< container.Count, i++) { dataFlow.container[i].callMetaData = meta; } } } class dataflow { signInt = intSig; signExt = extSig; metaData = meta;
public dataflow(signInt intSig, signExt extSig, metaData meta) { this.intSig = intSig; this.extSig = extSig; this.meta = meta; } public signInt callIntSign { get { return intSign; } set { intSign = value; } } public signExt callBusSign { get { return extSign; } set { extSign = value; } } public metaData callMetaData { get { return meta; } set { meta = value; } } ) } class signInt { string nameInt, funktionInt;
} class signExt { string nameExt, funktionExt;
} class metaData { string nameMeta, funktionMeta;
} |
Ich hoffe ihr könnt mir helfen. Ich weiß im Moment nicht wie ich das anstellen kann.
Jeder Versuch bisher läuft drauf hinaus, dass ich eine neue Liste erstelle die dann alle 3 Daten (intSig, extSig und metaData) enthällt. :-/
Vielen Dank und schönen Abend noch!
Gruß
Palladin007 - Sa 09.02.13 04:59
Gut, also erst einmal ist hier etwas schief gelaufen:
C#-Quelltext
1: 2: 3:
| signInt = intSig; signExt = extSig; metaData = meta; |
ich vermute mal, das sollte so aussehen:
C#-Quelltext
1: 2: 3:
| signInt intSig; signExt extSig; metaData meta; |
Und ich gehe auch mal davon aus, dass die nicht deklarierten Variablen in der ersten Methode irgendwo anders deklariert wurden, aber für das Beispiel nicht relevant sind.
Wirklich verstanden habe ich aber trotzdem nicht, was du vor hast.
Ich habe versucht, die Möglichkeiten zu erklären, die mir einfielen, vielleicht habe ich ja den Kern des Problemes getroffen oder angeschnitten, dass es trotzdem hilft:
Du hast eine Liste, der mit jedem Aufruf der Methode "ErzeugeFluss" ein neues Element hinzu gefügt wird. Die Meta-Daten sollen aus den bereits vorhandenen Daten erstellt werden und dann ebenfalls hinzu gefügt werden, aber wozu brauchst du dafür eine extra Methode und durchläufst dabei jedes mal die komplette Schleife?
So hast du nämlich das Problem, dass mit jedem neuen Element alle vorherigen Elemente plus dem Neuen durchlaufen und verarbeitet werden. Wenn du also nach einander 10 Elemente hinzu fügst, wird das erste Element 10 mal durchlaufen, das zweite Element 9 mal, das Dritte 8 mal, und so weiter. Da sehe ich keinen Sinn drin.
So oder so, wenn dann die Meta-Daten aus den zwei bereits vorhandenen Attributen von jedem Element erzeugt werden, kannst du das doch auch gleich im Konstruktor von dataFlow erledigen lassen, für den Fall, wenn keine gesonderten Meta-Daten angegeben wurden. Da bietet es sich ja an, den zu überladen. Dann musst du dich in der Handhabung mit der Liste gar nicht mehr darum kümmern.
Was ich in ähnlichen Fällen auch mache: Ich erstelle für eine Eigenschaft, die sich aus Anderen zusammen setzt, gar nicht erst ein privates Attribut um es dort zu speichern, sondern lasse sie in der get-Methode berechnen. Das gibt dann allerdings Komplikationen, wenn du noch eine set-Methode bereit stellen willst, denn dann müsstest du aus den Meta-Daten die beiden anderen Attribute heraus bestimmen können, oder eben nicht, wenn das nicht wichtig ist.
Wenn du das alles nicht willst, dann rufe aus der Schleife heraus einfach die passende Eigenschaft auf:
C#-Quelltext
1:
| container[i].callMetaData = meta; |
(Warum du das "dataFlow" noch vor container gehängt hast, verstehe ich auch nicht)
Und dennoch bedeutet die Schleife, dass die Meta-Daten in jedem Element für die vorhandenen und wahrscheinlich gleich bleibenden zwei anderen Attribute immer neu berechnet werden, wobei sich das Ergebnis sich ja nicht ändert, solange keine sich ändernden Einflüsse dazu kommen. Aber in so einem Fall lasse ich dann gerne das Attribut immer direkt innerhalb der ändernden Methode updaten, oder eben direkt in der Eigenschaft errechnen, aber das habe ich ja schon erwähnt.
Wenn du allerdings die Meta-Daten aus allen bereits vorhandenen Elementen erstellen lassen willst, dann ergibt die Schleife durchaus Sinn, auch wenn ich das dann nicht in eine extra Methode auslagern würde, aber das hängt dann wohl von dem konkreten Fall ab.
Aber auch hier ist der Unterschied zu vorher nicht so groß, du müsstest allerdings eine Variable für die Meta-Daten vor der Schleife deklarieren, dann in der Schleife entsprechend mit jedem Element so abändern, dass danach das richtige Ergebnis da steht und danach in einer zweiten Schleife jedem Element von "container" die neuen Meta-Daten zuweisen, auch hier gilt dann wieder:
C#-Quelltext
1:
| container[i].callMetaData = meta; |
Ich hoffe mal, ich habe irgendwo den Punkt getroffen, ansonsten melde dich einfach wieder und schildere am besten noch einmal dein Problem. ^^
WSS-130 - Sa 09.02.13 15:03
Palladin007 hat folgendes geschrieben : |
Gut, also erst einmal ist hier etwas schief gelaufen:
C#-Quelltext 1: 2: 3:
| signInt = intSig; signExt = extSig; metaData = meta; |
ich vermute mal, das sollte so aussehen:
C#-Quelltext 1: 2: 3:
| signInt intSig; signExt extSig; metaData meta; |
Und ich gehe auch mal davon aus, dass die nicht deklarierten Variablen in der ersten Methode irgendwo anders deklariert wurden, aber für das Beispiel nicht relevant sind.
...
Wenn du allerdings die Meta-Daten aus allen bereits vorhandenen Elementen erstellen lassen willst, dann ergibt die Schleife durchaus Sinn, auch wenn ich das dann nicht in eine extra Methode auslagern würde, aber das hängt dann wohl von dem konkreten Fall ab.
Aber auch hier ist der Unterschied zu vorher nicht so groß, du müsstest allerdings eine Variable für die Meta-Daten vor der Schleife deklarieren, dann in der Schleife entsprechend mit jedem Element so abändern, dass danach das richtige Ergebnis da steht und danach in einer zweiten Schleife jedem Element von "container" die neuen Meta-Daten zuweisen, auch hier gilt dann wieder:
C#-Quelltext 1:
| container[i].callMetaData = meta; |
Ich hoffe mal, ich habe irgendwo den Punkt getroffen, ansonsten melde dich einfach wieder und schildere am besten noch einmal dein Problem. ^^ |
@Palladin007,
Mit den oberen Punkten hast du recht.. da war ich etwas unaufmerksam beim schnellen tippeln :-)
Und ja, die nicht deklarierten Variablen kommen aus dem Rest des Programms :-)
Und, vielen Dank dein zuletzt beschriebener Punkt war genau mein Wunsch.
Das mit der Extra Methode stimmt natürlich auch. Möchte ich aber hier so realisieren um den Code lesbar zu halten.
Der Ablauf ist wie folgt:
Zuerst lese ich Daten ein aus verschiedenen Dateien. Alle eingelesene Daten stehen in Bezug zueinander, dieser wird dann in "ErzeugeFluss" generiert.
Und eben diese Daten haben, in relevanz der Tiefe, verschieden viele MetaDaten. und genau das ist der Grund :-)
Daten lesen -> Daten verknüpfen -> MetaDaten erzeugen -> Ausgabe.
Vielen Dank!
Palladin007 - Sa 09.02.13 19:51
Aber wäre es dann nicht sinnvoller, erst alle Elemente in die Liste einzufügen und dann als letztes die Meta-Daten aus allen Elementen bestimmen und überall einzufügen?
OlafSt - So 17.02.13 00:00
Die Frage würde ich mir sehr genau stellen, denn wie so üblich bei solchen Projekten werden die Zahlen schnell groß. Ergo: Du liest die erste Datei mit 100K Einträgen ein und erzeugst daraus 100K Metadaten. Dann liest du die zweite Datei mit 100K Daten ein und erzeugst die ersten 100K Metadaten nochmal, obwohl sie schon existieren, dann die zweiten 100K. Alles zusammen hast du nun 300K Metadaten erzeugt.
Nun kommt die dritte Datei mit 100K Daten und wieder werden die ersten 100K neu erzeugt (zum dritten Mal), dann die zweiten 100K zum zweiten Mal und dann die letzten 100K. Du hast also 600K Metadaten erzeugt, um daraus 300K Metadaten zu generieren. Was für eine grandiose Vergeudung von Rechenzeit und Speicherplatz ;)
Egal, wie man es dreht, es ist ziemlich sicher die beste Idee, die Metadaten erst ganz am Schluß zu generieren - oder eine Abfrage einzubauen, ob sie schon generiert sind. Ein Feld "MetaExists" vom Typ Bool könnte da helfen. Oder einfach nur ein Button "Metadaten erzeugen" und den Benutzer entscheiden zu lassen, wann er die Metas geneiertert haben will ;)
Palladin007 - So 17.02.13 04:52
Naja, Olaf, aber es geht doch darum, dass die Metadaten jedes einzelnen Elementes aus den Daten aller bereits vorhandenen Elemente zusammen ermittelt werden.
Wenn also 100k Elemente anfallen, dann kommt er nicht darum herum, alle durchlaufen zu lassen, da er die Metadaten aus allen Elementen zusammen benötigt - Zumindest habe ich das so verstanden.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!