2009-02-25 15 views
8

Ora che abbiamo una straordinaria funzionalità grazie a LINQ, mi chiedo quale sintassi sia preferibile. Per esempio, ho trovato il seguente metodo (solo pensato che fosse un buon esempio):È consigliabile utilizzare LINQ per sostituire i loop?

foreach (FixtureImageServicesData image in _fixture.Images) 
{ 
    if (image.Filename != _selectedFixtureImage.Filename && image.IsPrimary) 
    { 
     image.IsPrimary = false; 
     image.IsChanged = true; 
    } 
} 

Se dovessimo convertirlo in un approccio LINQ, che sarebbe simile a questa (non testato):

_fixture.Images.Where(x => x.Filename != _selectedFixtureImage.Filename && x.IsPrimary).ForEach(x => { x.IsPrimary = false; x.IsChanged = true; }); 

Quale preferiresti vedere e mantenere? È pazzo o geniale?

risposta

22

Utilizzando un metodo ForEach estensione va bene, ma c'è un approccio intermedio:

// Rename 'query' to something meaningful :) 
var query = _fixture.Images 
        .Where(image => _selectedFixtureImage.Filename 
            && image.IsPrimary); 

foreach (FixtureImageServicesData image in query) 
{ 
    image.IsPrimary = false; 
    image.IsChanged = true; 
} 

Se fai utilizzare un metodo ForEach, mi piacerebbe sicuramente formattare in più righe:

_fixture.Images 
    .Where(image => _selectedFixtureImage.Filename && image.IsPrimary) 
    .ForEach(image => { image.IsPrimary = false; image.IsChanged = true;}); 

(rientranza ridotta per evitare l'involucro ...)

o:

_fixture.Images 
     .Where(image => _selectedFixtureImage.Filename && image.IsPrimary) 
     .ForEach(image => { image.IsPrimary = false; 
          image.IsChanged = true; }); 

Si potrebbe anche voler estrarre il "non primario fare" bit in un metodo separato, a questo punto dovreste:

_fixture.Images 
     .Where(image => _selectedFixtureImage.Filename && image.IsPrimary) 
     .ForEach(MakeNonPrimary); 
+0

Non penso che i tuoi esempi di multi-linea debbano avere un punto e virgola dopo le istruzioni Where. –

+0

@Joel: risolto, grazie. –

1

Tutto ciò che riduce la complessità verticale o orizzontale è un più per me. Inoltre, il Linq è molto più descrittivo di ciò che stai cercando di realizzare.

2

Questo mi ricorda un po 'di "dovrei usare Regex o funzioni stringa standard" o "dovrei usare XSLT/XPATH per trasformare XML o usare SelectSingleNode()".

La prima opzione (ad esempio Regex/XSLT/Linq) è spesso considerata più elegante e potente da chiunque abbia trascorso del tempo ad apprenderla.

Mentre per tutti gli altri sembra essere meno leggibile e più complesso rispetto alla seconda opzione (cioè funzioni stringa, SelectSingleNode(), ciclo foreach semplice).

In passato sono stato accusato di complicare eccessivamente le cose utilizzando Regex e XSLT/XPATH nel mio progetto.

Proprio di recente sono stato accusato di essere "paura del cambiamento" preferendo semplice foreach (e anche per) loop in molte situazioni oltre Linq Dove, Foreach ecc

mi resi conto che la gente in entrambi i casi che ha detto che questo era il tipo che sente che c'è "l'unica strada" per fare tutto.

Considerando che ho sempre trovato molto più intelligente considerare ogni situazione nel suo merito e scegliere lo strumento giusto per il lavoro. Li ignoro e continuo con il mio approccio;)

Per quella situazione che descrivi, la prima opzione è più preferibile per me. Tuttavia, probabilmente avrei usato l'approccio Linq se il mio team fosse tutto competente in Linq e avessimo linee guida per evitare le grandi one-liner (dividendole)

Problemi correlati