2017-12-17 1 views
2

Ich habe diese Art:Warum ist die Eigenschaft des Objekts null, nachdem ich den Wert festgelegt habe?

public partial class ReportTrafficDepartment 
{ 
    public int _id; 

    public System.Nullable<int> _siteNum; 

    public System.Nullable<System.DateTime> _dateReport; 

    public string _siteName; 

    public System.Nullable<int> _prog1; 

    public System.Nullable<int> _progLayout1; 

    public System.Nullable<int> _prog2; 
} 

Und diese Funktion:

private void setDate(IEnumerable<ReportTrafficDepartment> report, int year, int month) 
{ 
    report.Select(r => r.dateReport = new System.DateTime(year, month, 1)); 
} 

Wie Sie kann ich sehen, versuchen, durch Sammlung der ReportTrafficDepartment Objekte iterieren und dateReport Eigenschaft festgelegt.

, aber nachdem die Methode ausgeführt wurde, ist die Eigenschaft aller ReportTrafficDepartment-Objekte null.

Alles was ich falsch mache Warum ist das Eigentum aller ReportTrafficDepartment Objets null?

+0

Sie haben einen Tippfehler, 'dateReport' existiert nicht in 'ReportTrafficDepartment',' _dateReport 'tut dies. Darüber hinaus besteht die Auswahl darin, die Quelldaten in eine andere zu projizieren, so dass Sie die Quellelemente nicht beeinflussen. – dcg

+3

Tun Sie dies nicht, Linq zu verwenden, um Nebenwirkungen zu erzielen, ist normalerweise eine sehr schlechte Idee. Dein Problem ist, dass linq * faul ist *, du wiederholst die Projektion nicht, so dass die Zuweisung niemals stattfindet. – InBetween

+0

@InBetween sollte ich foreach verwenden? – Michael

Antwort

6

Tun Sie dies nicht, Linq zu verwenden, um Nebenwirkungen zu erzielen, ist normalerweise eine sehr schlechte Idee.

Ihr Problem ist, dass linq ist faul, Sie sind nicht die Projektion iterieren, so dass die Zuordnung nie passiert. Dies ist einer der Gründe, warum Nebenwirkungen in linq-Abfragen zu sehr unerwarteten Ergebnissen führen können.

Wenn Sie tun dies wirklich gebogen sind, müssen Sie SetDate iterieren die Select Abfrage eifrig Count(), ToList() Aufruf machen, etc. Aber auch dies ist eine schlechte Idee, verwenden Sie einfach einen foreach Block, dies zu tun.

Verwandte Themen