尝试在LINQ循环中捕获

时间:2014-02-18 09:58:40

标签: c# .net linq exception-handling try-catch

我有以下代码:

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

有时SomeFunction()会返回null个对象,然后当我尝试在其上使用.Phone时,它会抛出NullReferenceException

有没有办法只在循环中捕获该项并跳过它并继续跳转到下一个元素而不是跳过整个循环?

1 个答案:

答案 0 :(得分: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)
              };

最后,使用方法语法,您还可以使用语句lambda,您可以在其中使用您想要的任何代码(以可读性为代价):

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