Forum: PC-Programmierung C#: Alternative zu List<Tuple<.>>


von Dev (Gast)


Lesenswert?

Hallo,

in einer Anwendung werden Daten in eine Liste, immer wieder aktualisiert 
bzw. gespeichert.
1
List<Tuple<string, long, int, long>> _Table = new List<Tuple<string, long, int, long>>();

Nun ist es so, dass wenn eine Wert neu abgelegt werden soll zunächst 
alle Werte in eine Zwischenvariable gespeichert müssen und im Anschluss 
können der Liste _Table die Werte übergeben werden. Es ist nicht möglich 
einzelne Werte zu ändern. Gibt es in C# eine Alternative hierfür?
1
string v1 = _Table[i].Item1;
2
long v2  = _Table[i].Item2;
3
int v3 = _Table[i].Item3;
4
long v4 = _Table[i].Item3;
5
6
_Table[i] = Tuple.Create(v1, v2, v3, v4);

von Hannes (Gast)


Lesenswert?

Ich würde einen eigenen Typ mit den vier Properties erstellen.

Es geht aber auch mit dynamic und dem ExpandoObject:
1
            dynamic d = new ExpandoObject();
2
            d.Text = "abc";
3
            d.Vau2 = 123L;
4
            d.Vau3 = 456;
5
            d.Vau4 = 789L;
6
7
            string text = d.Text;
8
            long v2 = d.Vau2;
9
            int v3 = d.Vau3;
10
            long v4 = d.Vau4;

Allerdings gibt es da kein IntelliSense... ;)

von Borislav B. (boris_b)


Lesenswert?

Hannes schrieb:
> Es geht aber auch mit dynamic und dem ExpandoObject:

!!! dynamic ist eigentlich nur bei Reflection sinnvoll. Ansonsten ist es 
eher tödlich :-)
Finger weg!

Hannes schrieb:
> Ich würde einen eigenen Typ mit den vier Properties erstellen.

+1

von Dev (Gast)


Lesenswert?

Die Liste besteht nicht nur aus einer Zeile. Ein Typ zu definieren macht 
glaube ich keinen Sinn.

von Hannes (Gast)


Lesenswert?

Warum nicht, wenn die Listenelemente alle vom selben Typ sind?
1
    List<MeinTyp> list = new List<MeinTyp>();
2
    list.Add(new MeinTyp() { Text = "abc", Vau2 = 123L, Vau3 = 456, Vau4 = 789L });
3
    list.Add(new MeinTyp() { Text = "abc", Vau2 = 123L, Vau3 = 456, Vau4 = 789L });
4
5
    list[1].Vau2 = 987L;

von Dev (Gast)


Lesenswert?

Ok dank!

Werde ich mal umsetzen.

von Dev (Gast)


Lesenswert?

1
        public struct MyStruct
2
        {
3
            private int x;
4
            private int y;
5
6
            public int X { get { return x; } set { x = value; } }
7
            public int Y { get { return y; } set { y = value; } }
8
        }
9
10
        List<MyStruct> list = new List<MyStruct>();
11
12
        list.Add(new MyStruct() { X = 1, Y = 2});
13
        list.Add(new MyStruct() { X = 3, Y = 5});
14
15
        list[1].Y = 9;

Wert lässt sich nicht ändern. Meldung Visual Studio:
Der Rückgabewert 
"System.Collections.Generic.List<PingTool.FormPingTool.MyStruct>.this[in 
t]"  kann nicht geändert werden, da er keine Variable ist.

von Borislav B. (boris_b)


Lesenswert?

Warum nimmst du ein struct? das ist völlig fehl am Platze. Da bekommst 
du ja dann immer eine Kopie. => Verwende eine Class.
Außerdem sind Autoproperties kürzer ;-)
1
  public class MyStruct
2
        {
3
            public int X { get; set; }
4
            public int Y { get; set; }
5
        }

von Hannes (Gast)


Lesenswert?

MyStruct muss eine Klasse sein. Von structs wird immer eine Kopie 
gemacht, wenn du über den Indexer drauf zugeifst. Du änderst also Y in 
der Kopie. Und mit der nächsten Zeile ist deine Änderung verloren. Du 
könntest den struct erst in eine Variable speichern, dort ändern und 
dann wieder an der entsprechenden Stelle in die Liste bringen.
Einfacher ist es, eine Klasse zu nehmen. Das Objekt gibt es einmal und 
du greifst über die Referenz darauf zu.
So gehts:
1
    public class MyStruct
2
    ...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.