| |
C# EckeItem 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? | |
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. | |
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! | |
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. | |
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. | |
| 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 |
|
|
Neu! sevCoolbar 3.0
Professionelle Toolbars im modernen Design!
Mit sevCoolbar erstellen Sie in wenigen Minuten ansprechende und moderne Toolbars und passen diese optimal an das Layout Ihrer Anwendung an (inkl. große Symbolbibliothek) - für VB und MS-Access Weitere InfosTipp des Monats TOP Entwickler-Paket
TOP-Preis!!
Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR...
Jetzt nur 599,00 EURWeitere Infos
|
|
|
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
|
|