2013-12-12 36 views
0

我想爲IEnumerable編寫一個類似於Select的TrySelect的擴展,TrySelect會忽略選擇Func引發異常的任何元素的選擇。IEnumerable上的TrySelect

我有以下,它的工作原理。

public static IEnumerable<TResult> TrySelect<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector) 
    { 
     List<TResult> ret = new List<TResult>(); 
     foreach (TSource input in source) 
     { 
      try 
      { 
       ret.Add(selector(input)); 
      } 
      catch { } 
     } 
     return ret; 
    } 

我想知道如何編寫擴展,而無需使用清單以保存不填充元素,直到他們被稱爲的IEnumerable的行爲。

+4

捕獲異常無論類型是有風險的。考慮在特定的異常類型上進行泛化,或者重構基礎函數。 – TrueWill

回答

6

使用收益回報:

public static IEnumerable<TResult> TrySelect<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector) 
    { 
     foreach (TSource input in source) 
     { 
      TResult result; 
      bool wasSuccesful = false; 
      try 
      { 
       result = selector(input); 
       wasSuccesful = true; 

      } 
      catch { } 
      if (wasSuccesful) 
      { 
       yield return result; 
      } 
     } 
    } 

MSDN文檔在這裏:http://msdn.microsoft.com/en-us/library/9k7k7cf0.aspx

+0

我想返回所有不拋出和異常的條目,這是否會做到這一點? – jimmyjambles

+0

是的,它會。這就是'wasSuccessful'跟蹤的內容。如果'selector'拋出一個異常,它不會'返回'這個值。此代碼應與您的示例代碼相同,但懶惰評估除外。 –

+0

@jimmyjambles你可以標記爲答案,如果這對你有用嗎? –