Autor Beitrag
WSS-130
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Sa 09.02.13 00:12 
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:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
List<string> test = new List<string>

// die Liste wurde bereits befüllt und nun möchte ich ein Element der Liste im nachinein ändern
// also mache ich:
test[3] = "verändert";

Nun ist also das dritte Elememnt der String-List "verändert".

Nun zu meinem konkreten Bsp:
ausblenden volle Höhe 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)
    {
        // hier erzeuge ich den Datenfluss
        // ein Element in einer Liste "myDbSignInt" wird anhand der Liste "myDbMap" mit dem entsprechenden Element "myDbSignExt" verknüpft

        //Dann wird jeder "Fluss" dem container hinzugefügt...
        container.Add(new dataFlow(intSig,busSig, null));

        ErzeugeMeta(container);
    }
    public void ErzeugeMeta(List<dataFlow> container)
    {
        // Und hier komme ich zu dem Problem
        // Es soll jetzt ein Element aus dem container (also intSig und extSig) genommen werden und daraus die meta erzeugt werden.
        //Das Element meta wird immer aus den selben Daten der anderen Elemente erzeugt. Und dann an entsprechender "eingefügt" werden, also:
        for (int i= 0, i< container.Count, i++)
        {
            //hier werden für jedes Element die metaDaten erzeugt.
            // jetzt müssen die metadaten dem container hinzugefügt werden, ich suche also etwas wie:
            dataFlow.container[i].callMetaData = meta;
            // Die null die in ErzeugeFluss dem Konstruktor übergeben wird, soll also mit den erzeugten metaDaten überschrieben werden.
        }
    }
}
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;

    //Konstruktor, get und set
}
class signExt
{
    string nameExt, funktionExt;

    //Konstruktor, get und set
}
class metaData
{
    string nameMeta, funktionMeta;

    //Konstruktor, get und set
}


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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Sa 09.02.13 04:59 
Gut, also erst einmal ist hier etwas schief gelaufen:

ausblenden C#-Quelltext
1:
2:
3:
    signInt = intSig;
    signExt = extSig;
    metaData = meta;


ich vermute mal, das sollte so aussehen:

ausblenden 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:

ausblenden 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:

ausblenden 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. ^^

Für diesen Beitrag haben gedankt: WSS-130
WSS-130 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Sa 09.02.13 15:03 
user profile iconPalladin007 hat folgendes geschrieben Zum zitierten Posting springen:
Gut, also erst einmal ist hier etwas schief gelaufen:

ausblenden C#-Quelltext
1:
2:
3:
    signInt = intSig;
    signExt = extSig;
    metaData = meta;


ich vermute mal, das sollte so aussehen:

ausblenden 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 486
Erhaltene Danke: 99

Win7, Win81, Win10
Tokyo, VS2017
BeitragVerfasst: 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 ;)

_________________
Lies, was da steht. Denk dann drüber nach. Dann erst fragen.
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: 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.