2016-07-13 11 views
2

Ich habe eine Klasse, die die verschiedenen gespeicherten Telefone beschreibt. Manchmal kann die Importance-Eigenschaft null sein. Hier ist die KlasseNullable Typ und .HasValue wirft immer noch eine Null-Ausnahme

public class PhoneTypeListInfo 
{ 
    public string AccountNum { get; set; } 
    public int PhoneType { get; set; } 
    public string PhoneNum { get; set; } 

    public int Importance { get; set; } 
} 

Ich habe eine Funktion definiert, die eine PhoneTypeListInfo, wenn die Telefonnummer und Kontonummer übereinstimmen einen bestimmten Satz von Werten zurück.

protected PhoneTypeListInfo RetrievePhoneType(string info, string acctNumber) 
    { 
     PhoneTypeListInfo type = xPhoneTypeList.Where(p => p.PhoneNum == info && p.AccountNum == acctNumber).FirstOrDefault(); 

     return type; 
    } 

Das alles funktioniert super. Das Problem, das ich habe, ist mit der Linq Abfrage unten.

List<AlertBasedPhones> xAccountPhones = new List<AlertBasedPhones>(); 
xAccountPhones = (from x in xAccountStuff 
        where x.Media == "Phone" 
        let p = RetrievePhoneType(x.Info, acct.AccountNumber) 
        let xyz = x.Importance = (p.Importance as int?).HasValue ? p.Importance : 0 
        orderby p.Importance descending 
        select x).ToList(); 

Was ich oben tue versucht, eine andere Klasse zu verwenden, die eine andere Zusammensetzung hat, mit Ausnahme der ‚Bedeutung‘ Eigenschaft aus der PhoneTypeListInfo zu erhalten.

Meine Frage ist letztlich, Was muss ich tun, um p.Importance zu erlauben, null zu sein, und setze es auf 0, wenn es Null ist, x.Importance 0 so machend auch.

+2

Ich glaube nicht, es ist 'p.Importance' das ist null, aber 'p' selbst. –

+0

Ich denke, Scott hat Recht, Sie würden einen zusätzlichen Scheck für p selbst benötigen, da 'RetrievePhoneType' kann null ' –

+0

den Null-Operator progaging? könnte hier nützlich sein. –

Antwort

6

Es ist nicht p.Importannce das ist Null, aber p selbst. Das ist die Sache, die Sie zuerst auf Null überprüfen müssen. Wenn Sie C# 6 verwenden, können Sie den Operator ?. verwenden. Sie können auch die Logik von (p.Importance as int?).HasValue ? p.Importance : 0 zu p.Importance ?? 0 verkleinern. Kombinieren beide erhalten Sie

List<AlertBasedPhones> xAccountPhones = new List<AlertBasedPhones>(); 
xAccountPhones = (from x in xAccountStuff 
         where x.Media == "Phone" 
         let p = RetrievePhoneType(x.Info, acct.AccountNumber) 
         let xyz = x.Importance = p?.Importance ?? 0 
         orderby p?.Importance descending 
         select x).ToList(); 
+0

p ist nicht null. Ich werde Roberts Antwort testen, aber es sieht so aus, als hätte ich stattdessen ein Ternär verwendet. –

+0

@ChrisClark Wenn 0 Zeilen "xPhoneTypeList.Where" entsprechen (p => p.PhoneNum == info && p.AccountNum == acctNumber) 'dann wird' p' null sein. Roberts Antwort ist die gleiche Null-Überprüfung mit '(null == p)', ich benutze nur den bequemeren '? .'-Operator, der mit C# 6 eingeführt wurde. –

+0

@ChrisClark, wenn Sie sicher sind, dass Sie nie eine Situation haben werden 'xPhoneTypeList.Where (p => p.PhoneNum == info && p.AccountNum == acctNumber)' gibt 0 Zeilen zurück und ändert '.FirstOrDefault()' in '.First()', so wird eine Ausnahme ausgelöst Es gab 0 Zeilen (aber wenn es nie 0 Zeilen gibt, wird es kein Problem sein) –

2

Verwenden Sie den ternären Operator. Ersetzen Sie p.Importance durch (null==p) ? 0 : p.Importance

Verwandte Themen