2011-04-01 89 views
2

如何在LINQ中編寫這個函數?如何用LINQ選擇* some *項目?

public List<TResult> select(List<string> source) 
{ 
    List<TResult> result = new List<TResult>(); 
    foreach (var a in source) 
    { 
     try { result.Add(TResult.Parse(a)); } 
     catch { } 
    } 
    return result; 
} 

我想只選擇可轉換爲TResult的項目。 TResult.Parse()返回TResult的新實例。

+0

有什麼不對當前的代碼?它不是做你想做的事嗎? – Bazzz 2011-04-01 09:43:17

+0

我想寫一個擴展函數IEnumerable (SafeSelect) – Poma 2011-04-01 09:47:31

回答

5

你可以通過報表不只是lambda表達式的LINQ方法:

var results = source.Select(item => 
    { 
    try 
    { 
     return TResult.Parse(item); 
    } 
    catch 
    { return null; } 
    }).Where(result => result != null).ToList(); 
0

一種方法是

List<TResult> result = source.Where(TResult.Parse(a) != default(TResult)).ToList() 

但是,假定解析()方法不拋出異常

+2

請注意,源和結果是不同的類型和'Where'子句返回相同的類型,它適用於 – Poma 2011-04-01 09:45:59

+0

這將不會編譯... – 2011-04-01 09:57:31

+1

也是有點有趣的是,當qeustion清楚地表明它們是 – sehe 2011-04-01 10:02:35

1

不完全是LINQ,但您可以編寫一個迭代器產量解決方案,以一次完成:

public static IEnumerable<TResult> SelectParse<TResult>(
             this IEnumerable<string> source) 
{ 
    foreach(string a in source) 
    { 
     TResult parsed; 
     try 
     { 
      parsed = TResult.Parse(a); 
     } 
     catch 
     { 
      continue; 
     } 
     yield return parsed; 
    } 
} 

List<TResult> results = source.SelectParse<TResult>().ToList();

但是如果你的Parse方法經常產生異常,那麼你可能想要寫一個版本的TryParse返回一個成功/失敗布爾代替。 (雖然這不會幫助編寫LINQ。)


修復了yield-inside-try - thanks。這個解決方案比接受的解決方案的小優點是它支持Parse返回null作爲有效結果,但是我懷疑你是否需要/想要這樣。

+0

時,沒有拋出任何異常。您忘記了'無法用catch子句在try塊的主體中​​產生值',但它很容易修復。 – Poma 2011-04-01 10:32:58

+0

哎呀 - 是的,我確實懷疑那是否真的合法,因爲我輸入了它。很好,謝謝。 – Rup 2011-04-01 10:39:24

0

你有訪問定義Parse,如果是的話它有一個TryParse方法,或者你可以創建一個類..

public class TResult 
    { 
     public static TResult Parse(string text) 
     { 
      //Parse here 
      return new TResult(); 
     } 
     public static bool TryParse(string text, out TResult mc) 
     { 
      try 
      { 
       mc = Parse(text); 
       return true; 
      } 
      catch(Exception ex) 
      { 
       mc = null; 
       return false; 
      } 
     } 
    } 

然後

public IEnumerable<TResult> Select(IEnumerable<string> result) 
    { 
     return result.Select(r=> 
      { 
       TResult item = null; 
       TResult.TryParse(r, item); 
       return item; 
      }).Where(item=>item != null); 
    }