【问题标题】:Try within Linq query [duplicate]在 Linq 查询中尝试 [重复]
【发布时间】:2014-02-14 11:05:21
【问题描述】:

有没有一种巧妙的方法可以忽略 Linq 中的异常?即,假设我有一个类ObjectA,它在其构造函数中接受一个字符串参数,并且在构造函数中进行了一些验证——这意味着如果字符串没有正确的格式,构造函数将抛出。通过以下代码,我将从字符串列表中获得ObjectA 的列表:

var result = new List<ObjectA>();
foreach (string _s in ListOfFiles) {
    try {
        ObjectA _A = new ObjectA(_s);
        result.Add(_A);
    }
    catch{}
}

所以我的问题是:是否有单行 linq 方式,a la(伪代码即将出现......)

var result = ListOfFiles.Select(n => try {new ObjectA(n)}).ToList();

【问题讨论】:

  • 你可以做到,就像在 Felipe 的解决方案中一样(他打败了我),但我认为这不是一个好主意。它可能导致大型集合的性能不佳 - 异常非常昂贵 - 而且它在概念上也很“脏”......相反,ObjectA 可能会公开一些方法,您可以询问 n 是否是合法值。如果有一天由于不同的原因引发异常怎么办 - 如果您默默地吞噬所有异常,则需要一段时间来跟踪错误。
  • 是的,我同意你的看法@Konrad Morawski。
  • 嗯,实际上这取决于。如果异常是异常情况(即通常您没有异常),那么您可以对大型集合使用异常处理。但是,如果发生异常,永远永远不要吞下它——要么处理并记录它,要么包装并抛出
  • @Konrad,是的,有一种方法来验证这是可能的,但是您需要首先构造实例才能访问该方法。在我的情况下,我想填充只读字段,所以它必须在构造函数中发生,我不能构造空对象,检查它是否有效,然后填充
  • @Sergey, Konrad: ofc 我同意应该处理异常。这段代码用于生产状态,我想快速做事。在最终版本中,我将添加验证方法/异常处理等。但这不是我的问题。

标签: c# linq exception


【解决方案1】:

考虑到您正在使用Linq to objects,您可以尝试使用Select() 方法中的范围和Where() 来过滤空输出:

        var result = ListOfFiles.Select(_s =>
            {
                try
                {
                    return new ObjectA(_s);
                }
                catch (Exception)
                {
                    return null;
                }

            }).Where(x => x != null).ToList();

使用这样的策略对 linq to objects 很有效,但 linq to sql 的效果却不尽相同,因为你自己想想,你会如何将它解析为 SQL?有一种简单的方法可以做到这一点。

【讨论】:

  • 不知道您可以在 Linq 查询中放置 try 块。谢谢!
  • 其实可以使用x =&gt; { ... }创建一个作用域,在作用域内可以正常写c#代码。在 linq to sql 中,它不能按你的意愿工作,但在 linq to objects 中,你可以做任何你想做的事情,但要注意性能。
猜你喜欢
  • 1970-01-01
  • 2019-01-26
  • 2013-02-03
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多