Funktion kürzen? lambda mit ref ? overload, define?



  • Ich möchte ein Funktion haben, die int/string als Eingabe bekommen kann, diese als Wert für ein Dictonary verwendet und mir den Wert zurück gibt.
    Jedoch immer "ref" und den Name des dict zu schreiben ist mir zu lang und übersichtlich. Es werden viele Abfragen in wenig code verwendet und es ist immer das Selbe Dict. Kann man das abkürzen? So dass man zB. nur noch getVal(5) statt getValue(ref dict, 5) schreiben kann. Lambda funktion schon probiert, aber da sagt es mir mit ref nicht möglich. Google hat nur ein Lösung gefunden, unter der Bedinung, dass dict darin nicht wieder in einer Funktion ist. Alternative wäre Lambda overload aber da hab ich nix gefunden zu.

    Oder könnte man das Problem ganz anders lösen?

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text.RegularExpressions;
    
    delegate int del(int i);  
    
    namespace Rextester
    {
        public class Program
        {
            public static int getValue(ref Dictionary<string, int> dict, int i){            
                if (!dict.ContainsKey(i.ToString())) return 0;            
                return dict[i.ToString()];
            }
            public static int getValue(ref Dictionary<string, int> dict, string s){
                if (!dict.ContainsKey(s)) return 0;            
                return dict[s];
            }
    
            public static void setVals(ref Dictionary<string, int> dict ){
                dict.Add("5", 5);
                dict.Add("drei", 3);
            }
    
            public static void gettVals(ref Dictionary<string, int> dict ){                        
    
                Console.WriteLine( getValue(ref dict,5).ToString() + " " + getValue(ref dict, "drei"));
                // =============> getValue(ref dict, 5) ist mir zu lange
    
                // ??? kann man das abkürzen
                // Console.WriteLine( getVal(5).ToString() + " " + getVal("drei"));
                //bei lambda funktion sagt er mir mit ref nicht möglich
            }
    
            public static void Main(string[] args)
            {
                 Dictionary<string, int> dict = new Dictionary<string, int>();
                //Your code goes here
                 setVals(ref dict);
    
                 gettVals(ref dict);           
    
            }
        }
    }
    


  • ganz vergessen, da kann man den code gleich testen
    http://rextester.com/



  • Wieso ist das überhaupt ref?
    Und was soll der ganze Quatsch überhaupt?



  • ref, da das dict recht groß ist und es Unterfunktionen verwenden. Änderung der Unterfunktion sollen an die übergeordnete weitergegeben werden. Kopieren des dict jedoch vermieden werden. Oder geht das auch ohne ref?

    Quatsch, da es nur ein vereinfachtes Beispiel ist. Und ggf. weil ich lange kein/noch nicht viel C# gemacht hab 🙂

    Gerne auch eine andere Lösung. Kurz soll es sein, da die Werte des dict dann in vielen verschiedenen Formeln verwendet werden.



  • Wenn du C# programmierst, solltest du den Unterschied zwischen Referenztypen (class) und Wertetypen (struct) kennen.

    In deinem Fall ist ref überflüssig, da Dictionary eine Klasse, und damit ein Referenztyp, ist (ref bräuchtest du hier nur, wenn du ein neues Objekt innerhalb der Methode anlegen möchtest, welches dann auch danach außerhalb weiterbenutzt werden soll).

    Und wenn du ganz auf den Parameter verzichten möchtest, dann müßtest du eine Membervariable davon anlegen:

    static Dictionary<string, int> dict = new Dictionary<string, int>();
    
    public static int getValue(string s)
    {
        if (!dict.ContainsKey(s)) return 0;            
        return dict[s];
    }
    

    PS: Verwende besser die TryGetValue-Methode.

    Und Methodennamen sollten laut Naming Guidelines in .Net mit einem Großbuchstaben anfangen.


Anmelden zum Antworten