2014-02-14 33 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中,它不能按你的想法工作,但是在對象中,你可以做任何你想做的事情,但要注意性能。 –