Jak "elegancko" sprawdzać wartość null?

0

witajcie,

mam pętlę, w której sprawdzam wartość jakiego obiektu:

 for (int i = 0; i < s.Length; i++)
            {
                if (s[i].objKeys[11].data[0] != "jakis_string")

problem w tym, że s istnieje na pewno, objKeys[11] istnieje na pewno, a data już niekoniecznie (gdy nie istnieje to jej wartość wynosi {string[0]}) i w momencie, gdy jej nie ma, to oczywiście nie ma także pierwszej wartości i program się wysypuje. Czy jest na to jakiś bardziej "elegancki" sposób niż:

 for (int i = 0; i < s.Length; i++)
            {
                if (s[i].objKeys[11].data.Length > 0)
                    if (s[i].objKeys[11].data[0] != "jakis_string")
0

Maybe

0

Zawsze można oba te warunki zapisać w jednym.

0

Rozwiązanie zaproponowane przez @szalonyfacet jest nie złe, w C# 6.0 pojawi się nawet specjalny operator dzięki któremu twój warunek będzie wyglądał trochę lepiej

if (s[i].objKeys[11].data?[0] != "jakis_string" ?? false)

Jednak podobnie jak w przypadku foreacha wypieranego przez linq i lambdy kod z wykorzystaniem starego mechanizmu jest czytelniejszy dla osób które nie są biegłe w C#

0

można po prostu użyć metody linq i napisać:

if (s[i].objKeys[11].data.FirstOrDefault() != "jakis_string")

"default" to domyślna wartość czyli w tym przypadku "null" które można spokojnie przyrównać do stringa

proste i czytelne

0

jako że default to null można też skorzystać z operatora "??" żeby nadać wartość domyślną w przypadku braku wartości

if ((data.FirstOrDefault() ?? "jakis_string") != "jakis_string")

w tym przypadku jeśli nie będzie pierwszego elementu to przyjmiemy że wartością do porównania jest "jakis_string"

osobiście dość często korzystam z tego typu konstrukcji
trzeba jednak pamiętać że wartość "jakis_string" zostanie przyjęta nie tylko gdy nie będzie elementów w kolekcji, ale również gdy pierwszy element kolekcji będzie null. Zazwyczaj miałem potrzebę pokrycia obu tych przypadków na raz więc wychodzi mi to na plus, ale u Ciebie niekoniecznie tak musi być

0
if ((data.FirstOrDefault() ?? "jakis_string") != "jakis_string")

Tak patrze i patrze i w sumie nie rozumiem. Co daje ten potworek?

0

data.First() to metoda która zwraca pierwszy element z kolekcji data, ale metoda ta wywali się gdy kolekcja nie zawiera elementów, data.FirstOrDefault działa tak samo tylko przy pustej kolekcji zwróci null (dla napisów albo 0 jeżeli jest to kolekcja liczb, ogólnie mówiąc wartość domyślną)
Operator ?? sprawdza czy to co jest po jego lewej stronie jest nullem jeżeli to zwraca lewą stronę jeżeli tak to prawą.

Natomiast jeżeli data będzie miało wartość null to obie metody się wysypią.

0

Ale ja wiem co robi pokolei wszystko. Nie rozumiem czemu sluzy akurat takie ulozonie tego.

0

To w takim ułożeniu null jest traktowany tak jak szukana wartość jak dla mnie trochę bez sensu (chyba że tak ma być).

0
n0name_l napisał(a):
if ((data.FirstOrDefault() ?? "jakis_string") != "jakis_string")

Tak patrze i patrze i w sumie nie rozumiem. Co daje ten potworek?

chodziło o podstawienie domyślnej wartości jeśli brak wartości
akurat w tym przypadku cokolwiek innego niż "jakis_string" nie miałoby sensu, bo null też byłby różny od "jakis_string" więc nie wnosiłoby to żadnej zmiany, więc taką wartość "domyślną" tu dałem jako przykład

0
szogun1987 napisał(a):

Natomiast jeżeli data będzie miało wartość null to obie metody się wysypią.

autor napisał że

gdy nie istnieje to jej wartość wynosi {string[0]})

czyli podstawiana jest pusta tablica, więc metoda się sprawdzi

0

Ale ten sam warunek mozna zapisac tak:

(data.FirstOrDefault() != null)

Nie rozumiem czemuby mialo sluzyc dostarczanie alternatywnej zawartosci, po czym porownywanie z nia...

Ahh juz lapie. No okej. Ale jak chcemy potem skorzystac z tego data[0], to nie wiemy czy to null czy cos roznego od "jakis_string", wiec kicha. :(

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