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 Key ansprechen (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 WRITEdatapoint nach dem Erzeugen noch änderbar sein? Wenn nicht bzw. zumindestens der karname sollte es nicht sein (denn dann müßtest du ja auch diesen im Dictionary ä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 kann
    

    verwenden.

    PS: Eigenschaften in C# sollten genauso wie Methoden mit einem Großbuchstaben anfangen, also KarName (oder KARname - ich weiß leider nicht was kar bedeutet ;- ), 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 Methode

    	static 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 return in einer case-Anweisung braucht man kein break mehr.



  • @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> record
    

    Hier ist record ein KeyValuePair<...>.
    Und zum Zugriff auf den PELdatapoint benutzt du ja record.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


Anmelden zum Antworten