C# - metoda zwracająca null

0

Mam taką metodę:

static string[] find_in_dict(string toFind, List<string[]> Dict)
        {
            string[] result = Dict.Find(x => x[0] == toFind);            
            return result;            
        }

Problem zaczyna się przy jej wywołaniu ponieważ jeśli nic nie znajdzie result is null. Czy można jakoś wywołać tą metodę w taki sposób aby jeśli zwróci null nie wywalała się mi programu?
Czy może bardziej prawidłowo jest nie zwracać null'a z metody tylko jakąś charakterystyczną wartość?

0

Chyba:

static string[]? find_in_dict(string toFind, List<string[]> Dict)

spełni swoje zadanie o ile kompilator przyjmie.

Dodałem tylko znak zapytania po nawiasach, to oznacza, że typ jest nullable.

0

Sprawdź po prostu czy to co otrzemales z metody nie jest nullem.

0

Nie rozumiem tej metody, w parametrze podajesz List<string[]>, w metodzie chcesz zwrocic string[], ok, ale dane do result szukasz jakby tylko w jednym elemencie listy Dict, po x, ktory jest elementem tablicy string[], ktora jest elementem List<string[]>. Ale moge glupoty pisac, dopiero sie ucze.

0

@aksimoN: Może po prostu zwróć wtedy pustą tablicę Array.Empty<string>().

A jeśli to nie spełni twoich oczekiwań to zainteresuj się typem Either<TResult, TError>, zaczerpniętego z programowania funkcyjnego. Albo Optional<T>, jak już @lion137 wspomniał. Tutaj jest wątek, który być może cię nakieruje.

Edit:
Jest jeszcze jedno rozwiązanie, które często jest wykorzystywane w .NET

bool TryFindInDict(string toFind, List<string[]> dict, [NotNullWhen(true)] out string[] result)
{
    ...
}

Wtedy jako wynik funkcji zwracasz czy wyszukiwanie powiodło się, a w result wynik tego wyszukiwania.

0

Problem zaczyna się przy jej wywołaniu ponieważ jeśli nic nie znajdzie result is null. Czy można jakoś wywołać tą metodę w taki sposób aby jeśli zwróci null nie wywalała się mi programu?

tak. Zwracaj liste zamiast tablicy

       static List<string> find_in_dict(string toFind, List<string[]> Dict)
        {
            var result = Dict.Find(x => x[0] == toFind).ToList();            
            return result;            
        }

teraz po prostu robisz foreach na rezultacie z tej funkcji. Jezeli nic nie bedzie kolekcja bedzie pusta foreach sie nie wykona

0

Posłuchałem @pikob:

static string[]? find_in_dict(string toFind, List<string[]> Dict)

wywołuję ją w IF i sprawdzam czy zwróciła null:

if (find_in_dict(args[0], Dict) is null) Console.WriteLine("Podano niewłaściwy argument, nie ma takiego w słowniku");
else ...........
0

w ogóle szkoda że momentami error handling w .NETcie ssie

np. LINQowe .FirstOrDefault dla value types, więc zazwyczaj pozostaje albo cast, albo exception albo ewentualnie napisanie własnego FirstOrResult czy FirstOrNull

1 użytkowników online, w tym zalogowanych: 0, gości: 1