vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
NEU! sevCoolbar 3.0 - Professionelle Toolbars im modernen Design!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

C# Ecke
Item in einer List finden 
Autor: goto50
Datum: 30.10.18 17:53

Hallo, ich komme aus der PHP Ecke und versuche mit gerade an C# und hab gleich ein Problem
In PHP erstelle ist komplexe Datenstrukturen gern mit Hashes, also Arrays mit benamten Indexen. Auch Arrays in Hashes usw.
Nun habe ich in C# einen eigenen Listenyp erstellt CANDataEntry, mit ein paar Eigenschaften wie z.B. "id" und eine List damit gefüllt.
Diese List hat ja nun keinen benamten Index, sondern auch einen numerischen. Wie finde ich nun ein Objekt welches die gleiche id hat wie ein neues welches ich einfügen möchte? Und zwar ohne dafür jedesmal über das ganze List zu iterrieren?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Item in einer List finden 
Autor: Kuno60
Datum: 30.10.18 20:53

Hallo Goto,

in C# und in VB, gibt es neben dem normalen Array mit numerischem Index, noch viele andere Auflistungen.
Diese findest du bei System.Collections und bei System.Collections.Generic.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Item in einer List finden 
Autor: goto50
Datum: 30.10.18 21:58

Danke, aber vielleicht könnten wir da etwas konkreter werden?
Also ich speichere derzeit Daten mit folgender Klasse:

    class CANDataEntry
    {
        public int time { get; set; }
        public int id { get; set; }
        public int dlc { get; set; }
        public string comment { get; set; }
        public int[] bytes { get; set; }
    }
in einer variablen:
private List<CANDataEntry> data;
Dazu erstelle ich mit den aus einer Datei gewonnen Informationen immer ein neues Objekt und hänge es über die Add-Methode an die Liste an:
CANDataEntry rec = new CANDataEntry{ ... };
data.Add(rec);
Das scheint auch zu klappen. Nun möchte ich vor dem einfügen feststellen ob es bereits einen Record gibt, welcher in der "id" Eigenschaft einen Wert hat wie er gerade aus der Datei gelesen wurde um Dubletten zu vermeiden.

Zwar finde ich was zu ".Contains()" usw. aber irgendwie komme ich mit der Syntax nicht klar. Ich muss der Suchfunktion doch irgendwie mitteilen wonach sie suchen soll, sprich was vergleichen werden soll. Auf Objekt-Ebene macht das keinen Sinn, denn die anderen Eigenschaften sind trotz gleichem id-Wert unterschiedlich. Ich suche also nicht EXAKT so ein Objekt sondern eines wo eine Eigenschaft übereinstimmt.

Momentan habe ich das mit einer Iterationsschleife durch alle vorhandenen, gespeicherten Objekte "gelöst", aber das ist für die Performance ein Killer, denn je größer das Array wird, desto länger dauert es ein neues Element hinzuzufügen. Das geht sicher einfacher und eleganter...

Danke für die Hilfe!
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Item in einer List finden 
Autor: Kuno60
Datum: 30.10.18 22:53

Also mit "Contains" kannst du nur testen, ob ein Objekt mit der gleichen Referenz bereits in der Liste enthalten ist. Wenn du prüfen willst, ob ein Eintrag mit der gleichen ID bereits enthalten ist, musst du "Exists" benutzen.
         CANDataEntry rec = new CANDataEntry();
         if (!data.Exists(x => x.id == rec.id))
            data.Add(rec);
Alternativ ist es auch möglich, in deiner Klasse, "Equals" zu überschreiben, dann dannst du auch "Contains" zum Testen benutzen.

Bei einer List wird aber immer die gesamte Liste durchlaufen, bis ein Ergebnis gefunden wird.
Schneller gehts mit Hashtable, HashSet<T> oder Dictionary<T1,T2>. Beim Dictionary kann die ID als Schlüssel dienen und du kannst mit "ContainsKey" prüfen, ob ein Schlüssel schon vorhanden ist.

Beitrag wurde zuletzt am 30.10.18 um 22:56:14 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Item in einer List finden 
Autor: goto50
Datum: 30.10.18 23:16

Klasse Kuno! Die Hash-Table ist genau das was ich vermisst hatte
Ich werde den Code mal umschreiben.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel