C#: Alternative zu List<Tuple<.>>

Gast #4010905
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);
Gast
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... ;)
Gast
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;
Gast
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.
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
        }
Gast
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
    ...

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 11 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.