【问题标题】:Try catch inside LINQ loop尝试在 LINQ 循环中捕获
【发布时间】:2014-03-17 23:45:28
【问题描述】:

我有以下代码:

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

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

有没有办法只捕获循环中的那个项目并跳过它并继续下一个元素而不是跳过整个循环?

【问题讨论】:

  • 一种方法是为从SomeFunction 返回的空项目返回一个特殊情况类,其中包含您在没有电话号码要设置时设置的默认电话号码。

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


【解决方案1】:

您可以将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
        };
    });

【讨论】:

  • @NadavMiller:请注意,我已经编辑了我的答案以提供替代方案。
猜你喜欢
  • 2013-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-13
  • 1970-01-01
相关资源
最近更新 更多