Strings mittels Referenzen ändern.



  • hallo,
    ich möchte in einer sortierten liste referenzen von strings speichern.
    wenn sich der inhalt, der hinter einer referenz steckt ändert, soll sich auch der string ändern.
    so gehts nicht:

    public static string a_string = "a string";
    
    public static SortedList<string, ref string> strings = new SortedList<string, string>()
    {
      { a_string, a_string }
    };
    

    wegen dem ref wird gemeckert.
    ich möchte die sortierte liste in eine funktion schicken. dort wird

    strings[a_string] = "another string";
    

    zugewiesen. nun soll auch a_string 'automatisch' diesen wert bekommen.

    geht das irendwie?
    mfg.



  • Du hast mehrere Probleme.
    1. Strings sind immer imutable
    2. Ein Key darf nur einmal existieren
    3. Doofe idee 😉

    Was du machen kannst, halte nur strings in der SortedList und arbeite mit funktionen wo du sagst "SetValue" usw, die löscht den alten Key, und setzt ihn neu.

    Besser wäre aber eine Liste von einem eigenen Objekt der das Kapselt.

    Bsp.:

    public class DicItem
    {
    public string Value { get; set; }
    }

    - public List<DicItem> Items;

    - Items.Sort(SortByValue);

    - DicItem val = Items.Where(d => d.Value == "Bla").FirstOrDefault();

    - val.Value = "Demo";
    Items.Sort(SortByValue);

    ...



  • CSL schrieb:

    Du hast mehrere Probleme.

    ojeee.

    CSL schrieb:

    1. Strings sind immer imutable

    macht ja nichts, ich kann doch einer statischen string variable trotzdem verschiedene 'imutables' zuweisen.

    CSL schrieb:

    2. Ein Key darf nur einmal existieren

    weiß ich, der key soll sich ja nicht ändern, sondern nur der wert.

    CSL schrieb:

    3. Doofe idee 😉

    nö, ganz im gegenteil. es geht darum weniger code bei der erneuten zuweisung schreiben zu müssen, weil ich von den a_string's ein paar dutzend vorliegen habe. mit c und c++ würd ich das mit zeigern hinbekommen, aber in c# weiß ich zurzeit noch nicht wie. vllt. iwie mit unsafe code, mal schauen 😉



  • Also ich checke nicht was du meinst.



  • str n00b schrieb:

    CSL schrieb:

    1. Strings sind immer imutable

    macht ja nichts, ich kann doch einer statischen string variable trotzdem verschiedene 'imutables' zuweisen.

    Du willst eine referenz eines Strings in einer liste und dem string woanders was zu weisen und das in der Liste soll sich mit ändern, right? Das geht eben nicht da du bei der zuweisung einen neuen string erstellst, da imutable, dh dein string in der liste wird immer der alte bleiben, so lange bis du ihn explizit zuweist oder ihn in eine klasse schachtelst wie ich oben zeigte.

    str n00b schrieb:

    CSL schrieb:

    2. Ein Key darf nur einmal existieren

    weiß ich, der key soll sich ja nicht ändern, sondern nur der wert.

    Du schriebst doch:

    str n00b schrieb:

    strings[a_string] = "another string";
    

    zugewiesen. nun soll auch a_string 'automatisch' diesen wert bekommen.

    Und das verstand ich so das der key auch ausgetauscht werden soll. Kann mich aber auch täuschen

    str n00b schrieb:

    CSL schrieb:

    3. Doofe idee 😉

    nö, ganz im gegenteil. es geht darum weniger code bei der erneuten zuweisung schreiben zu müssen, weil ich von den a_string's ein paar dutzend vorliegen habe. mit c und c++ würd ich das mit zeigern hinbekommen, aber in c# weiß ich zurzeit noch nicht wie. vllt. iwie mit unsafe code, mal schauen 😉

    Verpacke doch deine "Dictionary" in ein eigenes Objekt umd erlaube lesen und schreiben nur über zwei Methoden (meinetwegen ein Property) und der sorgt dafür das alles korrekt abläuft, dann hast auch auch immer nur ein single point of entry.

    Ich find die idee aber auch doof weil du so mal eben schnell böse Seiteneffekte bekommen kannst.

    Die Sache ist ja ganz einfach die:
    strings[a_string] = "another string";
    du sagst da nicht "der string ist nun "another string", sondern du sagst "die gespeicherte referenz zeigt nun auf den "another string" im Speicher.
    Der String worauf die Referenz vorher zeigte existiert noch weiterhin im Speicher, da deine interne liste darauf Zeigt.

    -> C# ist eine eigene Sprache, man löst Sachen nicht so wie man es aus anderen Sprachen gewohnt ist 😉 also lass disen Unsafe Quatsch, wenn du es wie in C++ lösen willst kannst du auch in C++ bleiben.


Anmelden zum Antworten