2009-02-25 8 views
8

Ahora que tenemos una funcionalidad tremenda gracias a LINQ, me pregunto qué sintaxis es preferible. Por ejemplo, me encontré con el siguiente método (sólo pensé que era un buen ejemplo):¿Es aconsejable usar LINQ para reemplazar los bucles?

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

Si nos vamos a convertirlo en un enfoque LINQ, se vería como este (no probado):

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

¿Qué preferirías ver y mantener? ¿Es esto loco o genio?

Respuesta

22

Utilizando un método ForEach extensión está bien, pero no hay un enfoque 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; 
} 

Si hace usar un método ForEach, sin duda me formatearlo en varias líneas:

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

(indentación reducida para evitar el embalaje ...)

o:

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

Incluso puede extraer el bit "sin ánimo de primaria" en un método separado, momento en el que tendría que:

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

No creo que los ejemplos de varias líneas deban tener un punto y coma después de las declaraciones Where. –

+0

@Joel: corregido, gracias. –

1

Cualquier cosa que reduzca la complejidad vertical u horizontal es una más para mí Además, el Linq es mucho más descriptivo de lo que estás tratando de lograr.

2

Esto me recuerda un poco "debería usar Regex o funciones de cadena estándar" o "debería usar XSLT/XPATH para transformar XML o usar SelectSingleNode()".

La primera opción (es decir, Regex/XSLT/Linq) a menudo se considera más elegante y poderosa por cualquiera que haya pasado algún tiempo aprendiéndola.

Mientras que para todos los demás parece ser menos legible y más complejo en comparación con la segunda opción (es decir, funciones de cadena, SelectSingleNode(), simple foreach loop).

En el pasado fui acusado de complicar demasiado las cosas al usar Regex y XSLT/XPATH en mi diseño.

Recientemente fui acusado de ser "miedo del cambio" al preferir foreach sencillo (e incluso para) bucles en muchas situaciones más LINQ Cuando, etc. Foreach

pronto me di cuenta de que la gente en ambos casos que se dijo que este era el tipo de personas que sienten que existe "la única forma" de hacer todo.

Considerando que siempre he encontrado que es mucho más inteligente considerar cada situación según sus méritos y elegir la herramienta adecuada para el trabajo. Simplemente los ignoro y continúo con mi enfoque;)

Para esa situación que describes, la primera opción es más preferible para mí. Sin embargo, probablemente usaría el enfoque de Linq si mi equipo fuera competente en Linq, y tuviéramos pautas de codificación para evitar las grandes líneas divisorias (dividiéndolos)

Cuestiones relacionadas