Suche mit indexof
-
@SeppJ sagte in Suche mit indexof:
HashSet
Guten Morgen,
hier bin ich noch zu neu in C# um das beurteilen zu können, was besser ist/wäre.
Hier die Problemstellung:
In der Datenbank gibt es records mit jeweils einem eindeutigen primarykey "karname"
Die Datenbank wird in meinem Programm ausgelesen und die "records" sollen im Programm so abgespeichert werden, das ich diese leicht durchsuchen und auslesen kann.
Somit geht der Zugriff schneller als immer über die Datenbank.
Je nach Anforderung werden die Daten manipuliert und sporadisch in die Datenbank zurück geschrieben.Um einen record zu finden wird immer nach dem eindeutigen "karname" gesucht.
Was wäre für diesen Anwendungsfall die beste, schnellste (Zugriff) aber auch "einfach" zu programmierende Lösung ?
PS: Die Datenbank/Record wird im Laufe der Zeit noch erweitert, aktuell 3 Felder, später sicher 20 Felder pro record.
Vielen Dank !!
-
@SeppJ sagte in Suche mit indexof:
In einer List hast du nicht wirklich eine andere Möglichkeit. Aber wenn du mit einer List vor hast, diese so anzusprechen, dann deutet das darauf hin, dass du keine List möchtest. Listen sind gut, um ein Element nach dem anderen durchzugehen, nicht um gezielt zwischen verschiedenen Elementen hin- und her zu springen
Eine .NET List<T> entspricht einem dynamischen Array (also wie in C++ ein
std::vector<T>, keine Linked-List), einzelne Elemente können also gezielt per Index angesprochen werden.@worst_case: @SeppJ hat recht, mit einem Dictionary<Key, Value> kannst du dann direkt ein Element über den
Keyansprechen (am besten mit TryGetValue(...)).
-
@Th69 Ich sitze gerade auf der Leitung, wie würde/müsste dann die Deklaration von meinem Beispiel aussehen, wenn der Aufbau der Daten gleich bleiben würde ?
public class WRITEdatapoint { public string karname { get; set; } public int usbnr { get; set; } public string setpoint { get; set; } }so in der Art:
Dictionary<string, WRITEdatapoint> pcereturns = new Dictionary<string, WRITEdatapoint>();
und der key wäre dann auch der karname ... ??? das verstehe ich nicht
-
Ja, genau so.
Und sollen die Eigenschaften eines
WRITEdatapointnach dem Erzeugen noch änderbar sein? Wenn nicht bzw. zumindestens derkarnamesollte es nicht sein (denn dann müßtest du ja auch diesen imDictionaryändern), dann solltest du ein record (auf deutsch Datensatz genannt) verwenden:public record WRITEdatapoint(string karname, int usbnr, string setpoint);oder alternativ wenigstens
public string karname { get; init; } // init bedeutet, daß es initialisiert werden muß, aber nachträglich nicht mehr verändert werden kannverwenden.
PS: Eigenschaften in C# sollten genauso wie Methoden mit einem Großbuchstaben anfangen, also
KarName(oderKARname- ich weiß leider nicht waskarbedeutet ;- ),USBNr,SetPoint, ...).
-
Hallo,
jetzt habe ich ein kleines Problem mit dem dictionary
Ich lese das dictionary in der foreach Schleife komplett aus.
Hier "Rückagebwert" der Schleife ist die Variable record mit der Struktur.
In der Schleife kann ich beliebig die Struktur nutzen. z.B. record.Value.Db passt.foreach (KeyValuePair<string,PELdatapoint> record in peldatapoints) { .... record.Value.Db, .... record.Value.Offset, readformat(record), 1 );Wenn ich nun den "record" an eine Unterfunktion übergeben will, wie stelle ich das an ?
z.B. readformat(record)
readmemtype(PELdatapoint record1)Das funktioniert nicht ... sitze gerade auf der Leitung
Vielen Dank !!
-
Außer, daß du hier 2 verschiedene Namen (
readformat,readmemtype) der Methode geschrieben hast, sollte es so richtig sein.Ansonsten poste den Code der Methode sowie mindestens die genaue Fehlermeldung!
-
Hallo,
es sind zwei Methoden ( readmemtype und readformat), die den selben Übergabeparameter (ein record des dictionary) bekommen sollen.
Anbei ein Teil der einen Methodestatic eDataType readmemtype(PELdatapoint record1) { switch (record1.Format.ToLower()) { case "D" : return eDataType.BYTE; break; case "byte" : return eDataType.BYTE; break;
-
Und was ist jetzt der genaue Fehler???
PS: Nach einem
returnin einercase-Anweisung braucht man keinbreakmehr.
-
@worst_case sagte in Suche mit indexof:
foreach (KeyValuePair<string,PELdatapoint> record in peldatapoints)
{
.... record.Value.Db,
.... record.Value.Offset,readformat(record),Die Fehlermeldung beim Aufruf "readformat(record)" in meiner IDE
Argument type 'System.Collections.Generic.KeyValuePair<string,ConnectSql.sqlProgramm.PELdatapoint>' is not assignable to parameter type 'ConnectSql.sqlProgramm.PELdatapoint'
??? keine Ahnung warum ????
-
Du mußt die Datentypen beachten:
KeyValuePair<string,PELdatapoint> recordHier ist
recordeinKeyValuePair<...>.
Und zum Zugriff auf denPELdatapointbenutzt du jarecord.Value-> also müßtest du auch diesen bei der Methode angeben.Daher solltest du besser den Variablennamen ändern:
foreach (KeyValuePair<string,PELdatapoint> pair in peldatapoints) // oder 'var pair' verwenden { PELdatapoint record = pair.Value; var format = readformat(record); }Oder wenn du nur die Werte haben willst (und nicht den Key), dann kannst du auch direkt
foreach (PELdatapoint record in peldatapoints.Values)verwenden.
-
.. super,
Vielen Dank