Estrazione delle espressioni lambda dalle query e dalla leggibilità di linq

3

Ogni tanto quando ho un lambda complesso, faccio qualcosa del genere:

Func<SomeObject, bool> equals = o =>
    o.ID == someID && o.Name == someName && IsAdd || ...
var myList = MyThings.Where(equals).ToList();

Supponiamo che la logica in equals non possa essere semplificata. L'estrazione del lambda dalla query linq migliora o riduce la leggibilità?

L'alternativa è:

var myList = MyThings.Where(o => o.ID == someID && o.Name == someName && IsAdd || ...).ToList();
    
posta ConditionRacer 01.10.2013 - 18:29
fonte

2 risposte

3

Quando formatti una query Linq complessa abbastanza bene (non lasciarla girare su troppe righe) non dovrebbe essere più difficile da leggere di una condizione complessa in un'istruzione while loop o if .

Il follow mi sta benissimo:

var myList = MyThings.Where(o => o.ID == someID
                              && o.Name == someName
                              && IsAdd
                              || /* other conditions */).ToList();

Così fa la versione che utilizza un% estrattoequals Func<T, bool> .

Tuttavia , di solito quando vedo un oggetto Func come quello, suppongo che potrebbe non essere sempre la stessa logica. Io uso un Func quando l'azione che si sta eseguendo deve essere passata esternamente o determinata da qualche condizione. In questo caso, il tuo Func si trova proprio accanto all'espressione Linq stessa, quindi è facile vedere che non è il caso, ma potrebbe confondere se fossero ulteriormente separati.

Supponiamo che questa logica sia stata utilizzata in una condizione if . Se la logica è abbastanza complessa da prendere in considerazione la possibilità di suddividerla nella propria variabile booleana, è probabilmente giustificato fare qualcosa di simile e creare una Func . Se dovessi scrivere la condizione direttamente nel corpo di if , è probabilmente abbastanza semplice da capire all'interno del corpo della tua funzione Where .

    
risposta data 01.10.2013 - 19:02
fonte
4

C'è un'altra alternativa. Se i lambda sono grandi, ti suggerirei di estrarre uno o più metodi. Qualcosa del genere:

var myList = myThings.Where(MatchesTheCondition).ToList();

private bool MatchesTheCondition(SomeObject o) {
  return o.ID == someID && o.Name == someName && IsAdd || ... ;
}

Naturalmente, il tuo metodo non dovrebbe essere denominato "MatchesTheCondition";)

    
risposta data 02.10.2013 - 04:25
fonte

Leggi altre domande sui tag