2015-03-11 3 views
0

Возьмите этот метод f.e .:Выберите результат, где положение

public static Function Parse(string codeAndData) 
{ 
    return (from factory in factories 
      where factory.Parse(codeAndData) != null 
      select factory.Parse(codeAndData)).FirstOrDefault(); 
} 

Как вы можете видеть, factory.Parse(codeAndData) вызывается дважды, что плохая практика. Поэтому мы могли бы написать это следующим образом:

public static Function Parse(string codeAndData) 
{ 
    Function function = null; 
    return (from factory in factories 
      where (function = factory.Parse(codeAndData)) != null 
      select function).FirstOrDefault(); 
} 

Но вышеизложенное не кажется мне очень изящным. Есть ли лучшая альтернатива LINQ?

+5

сделать выбор перед где – csharpwinphonexaml

+0

Вашего вторым вариантом является _bad_. Вам следует избегать побочных эффектов. Если вы решили распараллелить эту операцию, вы можете столкнуться с беспорядком на руках. – JLRishe

+0

@JLRishe это было плохо, вот в чем причина моего вопроса :) –

ответ

3

Это очень просто с помощью синтаксиса метода цепным:

return factories.Select(f => f.Parse(codeAndData)) 
       .FirstOrDefault(p => p != null); 

С синтаксисом понимания, вы можете сделать это с let:

return (from factory in factories 
     let p = factory.Parse(codeAndData) 
     where p != null 
     select p).FirstOrDefault(); 

Поскольку вы уже смешивание FirstOrDefault с синтаксисом понимания , вы также можете сделать это:

return (from factory in factories 
     select factory.Parse(codeAndData)) 
     .FirstOrDefault(p => p != null); 

bu Это похоже на глупую альтернативу первому варианту.

1

Вместо того, чтобы использовать задание, вы можете сделать процедуру выбора перед:

public static Function Parse(string codeAndData) { 
    return (from factory in factories 
      select factory.Parse(codeAndData) 
      ).Where(y => y != null).FirstOrDefault(); 
} 
Смежные вопросы