2014-02-14 32 views
4

有没有一种简洁的方式来忽略Linq中的异常?也就是说,我有一个类ObjectA,它在构造函数中接受一个字符串参数,并且在构造函数中有一些验证正在进行 - 这意味着如果字符串没有正确的格式,构造函数将抛出。通过下面的代码,我会从一个字符串列表获得ObjectA列表:尝试Linq查询

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

所以我的问题是:是否有一个行LINQ的方式,一拉​​(伪代码来了...)

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

你可以做到这一点,在菲利普的溶液(他打我),但我不认为是个好主意。它可能导致大集合的性能不佳 - 异常非常昂贵 - 并且它在概念上也是“肮脏”的......相反,“ObjectA”可能暴露出一些方法,您可能会问'n'是否是合法值。如果有一天出于不同的原因抛出异常 - 如果你默默地吞噬所有的异常,追踪这个bug需要一段时间。 –

+0

是的,我同意你@Konrad Morawski。 –

+0

嗯,实际上它取决于。如果异常是特殊情况(即通常你没有),那么你可以使用大集合的异常处理。但永远不会永远不会吞噬异常,如果它发生 - 要么处理并记录它或包装并抛出 –

回答

3

尝试使用在Select()方法和范围Where()过滤空输出:

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

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

不知道你可以放一个'try'块在Linq查询中。谢谢! – EluciusFTW

+1

其实,你可以使用'x => {...}'创建一个范围,在你可以正常编写c#代码的范围内。在linq to sql中,它不能按你的想法工作,但是在对象中,你可以做任何你想做的事情,但要注意性能。 –