2013-12-12 1 views
0

Я хотел бы написать расширение для IEnumerable, похожее на Select called TrySelect, TrySelect проигнорирует выбор любого элемента, в котором выбрано Func, генерирует исключение.TrySelect on IEnumerable

У меня есть следующее, которое работает.

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 вы можете пометить его как ответ, если это сработает для вас? –

Смежные вопросы