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?
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
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Danke für die schnelle Antwort.
Ich schaue mir die Eigenschaften dann mal genauer an.
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... 😄
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
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code