2014-02-18 38 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:请注意,我编辑了我的答案以提供替代方案。 –