2016-07-13 16 views
2

私は、格納されているさまざまな電話を記述するクラスを持っています。場合によってはImportanceプロパティをnullにすることもできます。ここで私は電話番号と口座番号が値のセットと一致する場合PhoneTypeListInfoを返す関数を定義したクラスnullの型と.HasValueはまだNull例外をスローします

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

    public int Importance { get; set; } 
} 

です。

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

     return type; 
    } 

これはすべて素晴らしいです。私が持っている問題は、以下のlinqクエリです。 PhoneTypeListInfoから「重要性」プロパティを取得するため除いて、異なる組成を有する別のクラスを使用しようとしている私は何をやっている以上

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(); 

私の質問は最終的にp.Importanceをnullにするためには何をする必要がありますか?また、nullの場合は0に設定すると、x.Importanceも0になります。

+2

私はそれが 'p.Importannce'はnullではないと思いますが、' p'自体です。 –

+0

私はScottが正しいと思います。 'RetrievePhoneType'がヌルを返すことができるので、あなたはp自身のために余分なチェックを必要とします –

+0

null progagating operator?ここで役に立つかもしれない。 –

答えて

6

と置き換えます。p.Importannceはnullですが、pです。それが最初にnullをチェックする必要があることです。 C#6を使用している場合は、?.演算子を使用できます。また、(p.Importance as int?).HasValue ? p.Importance : 0からp.Importance ?? 0のロジックをsmiplifiyすることもできます。両方を組み合わせることができます

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はnullではありません。私はロバーツの答えをテストしますが、代わりに三元を使うべきだったようです。 –

+0

@ChrisClarkもしx行が 'xPhoneTypeList.Where(p => p.PhoneNum == info && p.AccountNum == acctNumber)にマッチすれば、' p'はnullになります。 Robertの答えは 'null(null == p)'で同じヌルチェックをしていますが、C#6で導入されたより便利な '? '演算子を使用しています。 –

+0

@ChrisClark 'xPhoneTypeList.Where(p => p.PhoneNum == info && p.AccountNum == acctNumber)'は0行を返し、 '.FirstOrDefault()'を '.First()'に変更すると、例外がスローされます。 0行があります(しかし、0行が決して問題になることはありません)。 –

2

三項演算子を使用します。 p.Importance(null==p) ? 0 : p.Importance

関連する問題