Suche mit indexof
-
Hallo,
ich lese eine Datenbank aus und speichere mir bestimmte Werte in einer "List" um im Programm schneller darauf zugreifen zu können und nicht ständig die Datenbank zu bemühen.
Wie kann ich in der komplexen List "writedatapoints" nach z.B. mpi == 24 suchen, damit der Index zurückgegeben wird um danach mit dem Index auf andere Werte z.B. writedatapoints[index].setpoint zuzugreifen.
Eventuell gibt es etwas besseres als "indexof" .... ??public class WRITEdatapoint { public string karname { get; set; } public int usbnr { get; set; } public string setpoint { get; set; } } public static List<WRITEdatapoint> writedatapoints = new List<WRITEdatapoint>();Danke !!
-
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 (Zumindest nicht, wenn du sie erst suchen musste. Wenn du den Index schon kennst, ist eine List toll zum Anspringen). Vielleicht willst du eine sortierte List? Damit kann man ein gesuchtes Element einfacher finden. Oder, ganz anders gedacht, suchst du ein Dictionary? Eventuell auch ein HashSet, je nachdem, was du genau vor hast. Jedenfalls solltest du nochmal nachdenken, wie du deine Daten für deinen Anwendungszweck am besten organisierst.
-
@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, ...).