Laden...

LINQ - NULL Reference Exception bei einer einfachen Abfrage

Erstellt von HansDampf vor 6 Jahren Letzter Beitrag vor 6 Jahren 1.882 Views
H
HansDampf Themenstarter:in
2 Beiträge seit 2017
vor 6 Jahren
LINQ - NULL Reference Exception bei einer einfachen Abfrage

Hallo,

ich lerne gerade LINQ und wollte ein Beispiel aus einem Tutorial nachstellen, aber bei der Ausführung des Codes bekomme ich immer eine Null Reference Exception. Kann mir jemand sagen, was das Problem ist?

Hier ist mein Code:

            List<Person> personen = new List<Person>();
            List<string> namen = new List<string>();

            Person p1 = new Person("Hans Dampf", new DateTime(1981,04,04), Person.Geschlechter.Maennlich);
            Person p2 = new Person("Pipi Langstrumpf", new DateTime(1980, 05, 30), Person.Geschlechter.Weiblich);

            personen.Add(p1);
            personen.Add(p2);

            namen.Add("Hans Dampf");
            namen.Add("Pipi");

            var bla = from name in namen where name.StartsWith("H") select name;

            var treffer = from person in personen
                          from name in namen
                          where name.StartsWith("H")
                          where person.Name.StartsWith(name)        <-- Hier kommt die Exception (System.NullReferenceException: "Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.")
                          select person;

Wenn ich die Bedingung auf

where person.Name == name

ändere erhalte ich zwar keine Exception, aber ein leeres Ergebnis zurück.
Wer weiß Rat?

16.833 Beiträge seit 2008
vor 6 Jahren

Was genau null ist siehst Du via Debugger. [Artikel] Debugger: Wie verwende ich den von Visual Studio?
Sicher, dass Du die Eigenschaften in der Klasse Person richtig setzt? Riecht prinzipiell nicht danach.

Ansonsten: [FAQ] NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt

H
HansDampf Themenstarter:in
2 Beiträge seit 2017
vor 6 Jahren

Danke für die schnelle Antwort.
Ich schaue mir die Eigenschaften dann mal genauer an.

T
461 Beiträge seit 2013
vor 6 Jahren

Hallo,

wie @Abt schon sagte, 'person.Name' dürfte anscheinend nie gesetzt werden. Such mal alle Verweise auf '.Name', dann siehst du sofort eine Auflistung dessen, wo überall dieses '.Name' verwendet wird. Es sollte normal irgendwo '.Name = wert;' (oder ähnlich) vorkommen.

Wenn, dann müßtest mit dem Debugger im Einzelschritt durchnavigieren und kontrollieren, warum dein Code nicht an diese Stelle kommt.

[Edit1]@HansDampf war schneller 😃 [/Edit1]

Ich habe den Titel mal angepasst, so dass Suchende auch etwas damit anfangen können. EDIT: Ich sollte beim Wort "Shift" im Titel das "f" nicht vergessen... 😄

1.029 Beiträge seit 2010
vor 6 Jahren

Hi,

mir stellt sich ehrlich gesagt auch die Frage, was du mit dieser Abfrage überhaupt beabsichtigst 😕

Wenn du Personen nach Namen filtern möchtest - brauchst du keine gesonderte Liste von Namen. Vor allem - warum 2 x from? Willst du gruppieren? Oder nach den Bedingungen aus "bla" filtern?

Mal ausgehend von letzterem:


var bla = from name in namen where name.StartsWith("H") select name;
var treffer = personen.Where(p => bla.Contains(p.Name));
// alternative:
var treffer2 = personen.Where(p => p.Name.StartsWith("H"));

Grundsätzlich besteht gerne die Möglichkeit, dass Schlicht das Property Name der Klasse Person null ist...

LG

16.833 Beiträge seit 2008
vor 6 Jahren

Er hat doch geschrieben, dass er gerade nen Tutorial macht....

Contains macht zudem was ganz anderes als StartsWith.
Zwei völlig verschiedene Logikbausteine. Daher - je nach Logik - keine Alternative.