2014-02-18 249 views
2

我有以下代碼:嘗試捕捉

var newList = from user in allUsers.ToList() 
         select new 
         { 
          user.FirstName, 
          user.LastName, 
          user.Email, 
          Phone = SomeFunction(user.Data).Phone, 
         }; 

有時SomeFunction()回報null對象,然後當我嘗試使用.Phone就可以了,它拋出一個NullReferenceException

有沒有辦法只捕獲循環中的項目並跳過它並繼續下一個元素而不是跳過整個循環?

+0

一種方法是返回一個特例類包含如果沒有電話號碼,設置你會設置默認的手機號碼'SomeFunction'返回一個空項。 –

回答

4

您可以分配null(或默認號碼)的電話,在查詢中let條款是有用的,以防止多個評價:

var newList = from user in allUsers.ToList() 
       let data = SomeFunction(user.Data) 
       select new 
       { 
        user.FirstName, 
        user.LastName, 
        user.Email, 
        Phone = data == null ? null : data.Phone, 
       }; 

另一種選擇是封裝邏輯從檢索電話用戶在一個方法中。你甚至可以使用一個真正的try/catch如果必要的話:

private string GetPhone(User user) 
{ 
    if (user == null) 
     return null; 
    return user.Phone; 
} 

// ...

var newList = from user in allUsers.ToList() 
       select new 
       { 
        user.FirstName, 
        user.LastName, 
        user.Email, 
        Phone = GetPhone(user) 
       }; 

最後,用方法的語法,你也可以使用一個語句的λ,你可以使用任何你想要的代碼(在可讀性成本):

var newList = allUsers.ToList() 
    .Select(user => 
    { 
     var data = SomeFunction(user.Data); 
     return new 
     { 
      user.FirstName, 
      user.LastName, 
      user.Email, 
      Phone = data == null ? null : data.Phone 
     }; 
    }); 
+0

輝煌,謝謝! –

+0

@NadavMiller:請注意,我編輯了我的答案以提供替代方案。 –