2010-01-28 3 views
4

У меня есть запрос LINQ следующим, как иметь дело с исключением в LINQ заявление Выберите

m_FOO = rawcollection.Select(p=> p.Split(' ')).Select(p => 
      { 
       int thing = 0; 

       try 
       { 
        thing = CalculationThatCanFail(p[1]); 
       } 
       catch{} 
       return new { Test = p[0], FooThing = thing}; 
      }) 
      .GroupBy(p => p.Test) 
      .ToDictionary(p => p.Key, s => s.Select(q => q.FooThing).ToList()); 

Итак, CalculationThatCanFail бросает иногда. Я не хочу вводить null, а затем фильтровать его с помощью другого инструкции Where, а значение нежелательной почты в равной степени неприемлемо. Кто-нибудь знает, как с этим справиться? Благодарю.

EDIT: Есть веская причина для оператора double Select. Этот пример был отредактирован для краткости

ответ

1

Для этих ситуаций я использую тип Maybe (аналогичный this one) для вычислений, которые могут возвращать или не возвращать значение вместо значений нулей или нежелательных сообщений. Это будет выглядеть следующим образом:

Maybe<int> CalculationThatMayHaveAValue(string x) 
{ 
    try 
    { 
     return CalculationThatCanFail(x); 
    } 
    catch 
    { 
     return Maybe<int>.None; 
    } 
} 

//... 

var xs = ps.Select(p => 
      { 
       Maybe<int> thing = CalculationThatMayHaveAValue(p[1]); 
       return new { Test = p[0], FooThing = thing}; 
      }) 
      .Where(x => x.FooThing.HasValue); 
2

Я не ясно из вопроса, если вы имеете в виду, вы не хотите использовать null для FooThing или вы не хотите использовать null для всего анонимно типизированных объекта. В любом случае, будет ли это соответствовать счету?

m_FOO = rawcollection.Select(p=> p.Split(' ')).Select(p => 
     { 
      int thing = 0; 

      try 
      { 
       thing = CalculationThatCanFail(p[1]); 
       return new { Test = p[0], FooThing = thing}; 
      } 
      catch 
      { 
       return null; 
      } 
     }) 
     .Where(p => p != null) 
     .GroupBy(p => p.Test) 
     .ToDictionary(p => p.Key, s => s.Select(q => q.FooThing).ToList()); 
+0

да, мне было интересно, если есть в любом случае, чтобы избежать .гда (р => р! = NULL) – Steve

+0

@Steve, О порядке. Я не совсем уверен, но единственное, что я могу придумать в LINQ, - это использовать метод расширения ForEach(), но даже тогда вы в конечном итоге вручную создадите коллекцию/перечисляемую какую-то чем LINQ построить его для вас. Если я могу спросить, каково ваше возражение против предложения 'Where'? – devuxer

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