none
C# - Dictionary "Null Werte behandeln" RRS feed

  • Frage

  • Aufgabenstellung:

    Dictionary:

    Key = Firma

    Value = Array von Arbeitern

    Zusätzlich wird ein Name mitgegeben und ich soll heraus finden, in welcher Firma er arbeitet. Das habe ich alles geschaft, doch ich muss das noch machen:

    "Übergebene NULL-Werte sind nicht behandelt. (NULL Rückgabe erwartet)"

    Wie stelle ich das an??

    Hier der Code:

    class Arbeiter
    {
        public string Firmen(System.Collections.Generic.Dictionary<string, string[]> dic, string arbeiter)
        {   
            foreach (System.Collections.Generic.KeyValuePair<string, string[]> kvp in dic)
            {
                foreach (var name in kvp.Value)
                {
                    if (name == arbeiter)
                    {
                        return(kvp.Key);
                    }
                }
            }
            return String.Empty;
        }
    }

    Gruß Max

    Sonntag, 21. Mai 2017 13:02

Antworten

  • Hallo,

    ergänzend zu den anderen Antworten:

    Du musst natürlich die notwendigen Vorprüfungen durchführen. Die übergebenen Parameter können vielfältig Probleme machen. Der Parameter "arbeiter" kann z.B. "null" sein, im Dictionary kann Value "null" annehmen oder ein Array ohne Elemente.

    Du kannst auch den ersten Parameter mit "null" übergeben, dass führt aber zu einer Ausnahme.

    Alle Fälle kann man behandeln, und jeweils "null" zurückgeben. Aus der Rückgabe kannst du dann aber schwer folgern, weshalb du "null" zurückerhalten hast und somit höchstens eine Fehlermeldung der Art "Ein Problem ist aufgetaucht" anzeigen. Deine Nutzer werden es lieben...

    Du kannst aber auch die Signatur deiner Methode ändern. Als Rückgabewert käme ein Tupel in Frage (seit c#7 besonders einfach) oder ein Statuswert als Ref/Out-Parameter.

    public Tuple<int, string> firmen1(Dictionary<string, string[]> test, string arbeiter) {}
    
    // oder
    
    public (int status, string firma) firmen2(Dictionary<string, string[]> test, string arbeiter) {}
    
    // oder
    
    public string firmen3(Dictionary<string, string[]> test, string arbeiter, out int status) {}
    
    

    um mal ein paar Varianten zu zeigen.

    Damit könntest du aussagekräftige Ergebnisse erzeugen.

    Gruß

    Sonntag, 21. Mai 2017 14:06
  • Ich bin mir nicht sicher wie die Aufgabenstellung zu interpretieren ist, aber ich vermute, dass wenn einer der Inputparameter null ist, das Programm von vornherin null zurückgeben soll. Du musst also am Anfang des Programmes prüfen, ob einer der beiden Parameter null ist. Wenn ja gibt null zurück.

    if(string.IsNullOrEmpty(arbeiter) || dic == null)
    return null;

    Tipp: Sie dir mal LINQ an. Damit wäre die Aufgabenstellung deutlich schöner zu lösen. Ein ungetesteter Lösungs-Vorschlag meinerseits wäre:

    var result = dic.Where(kvp => kvp.Value.Contains(arbeiter)).Select(kvp => kvp.Key);
                return result.FirstOrDefault();
    (Anstatt der beiden foreach-Schleifen)


    Sonntag, 21. Mai 2017 13:32

Alle Antworten

  • Ich bin mir nicht sicher wie die Aufgabenstellung zu interpretieren ist, aber ich vermute, dass wenn einer der Inputparameter null ist, das Programm von vornherin null zurückgeben soll. Du musst also am Anfang des Programmes prüfen, ob einer der beiden Parameter null ist. Wenn ja gibt null zurück.

    if(string.IsNullOrEmpty(arbeiter) || dic == null)
    return null;

    Tipp: Sie dir mal LINQ an. Damit wäre die Aufgabenstellung deutlich schöner zu lösen. Ein ungetesteter Lösungs-Vorschlag meinerseits wäre:

    var result = dic.Where(kvp => kvp.Value.Contains(arbeiter)).Select(kvp => kvp.Key);
                return result.FirstOrDefault();
    (Anstatt der beiden foreach-Schleifen)


    Sonntag, 21. Mai 2017 13:32
  • Hallo,

    ergänzend zu den anderen Antworten:

    Du musst natürlich die notwendigen Vorprüfungen durchführen. Die übergebenen Parameter können vielfältig Probleme machen. Der Parameter "arbeiter" kann z.B. "null" sein, im Dictionary kann Value "null" annehmen oder ein Array ohne Elemente.

    Du kannst auch den ersten Parameter mit "null" übergeben, dass führt aber zu einer Ausnahme.

    Alle Fälle kann man behandeln, und jeweils "null" zurückgeben. Aus der Rückgabe kannst du dann aber schwer folgern, weshalb du "null" zurückerhalten hast und somit höchstens eine Fehlermeldung der Art "Ein Problem ist aufgetaucht" anzeigen. Deine Nutzer werden es lieben...

    Du kannst aber auch die Signatur deiner Methode ändern. Als Rückgabewert käme ein Tupel in Frage (seit c#7 besonders einfach) oder ein Statuswert als Ref/Out-Parameter.

    public Tuple<int, string> firmen1(Dictionary<string, string[]> test, string arbeiter) {}
    
    // oder
    
    public (int status, string firma) firmen2(Dictionary<string, string[]> test, string arbeiter) {}
    
    // oder
    
    public string firmen3(Dictionary<string, string[]> test, string arbeiter, out int status) {}
    
    

    um mal ein paar Varianten zu zeigen.

    Damit könntest du aussagekräftige Ergebnisse erzeugen.

    Gruß

    Sonntag, 21. Mai 2017 14:06