2009-02-25 8 views
8

Jetzt, da wir dank LINQ eine enorme Funktionalität haben, frage ich mich, welche Syntax vorzuziehen ist. Zum Beispiel fand ich das Verfahren folgende (nur dachten, es ein gutes Beispiel war):Ist es sinnvoll, LINQ zu verwenden, um Schleifen zu ersetzen?

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

Wenn wir es auf einen LINQ Ansatz konvertieren, würde es so aussehen (nicht getestet):

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

Was würden Sie lieber sehen und pflegen? Ist das verrückt oder genial?

Antwort

22

eine ForEach Erweiterung Methode ist in Ordnung, aber es gibt ein Zwischen Ansatz:

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

// 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; 
} 

Wenn Sie eine ForEach Methode verwenden tun, ich kann es auf jeden Fall in mehreren Zeilen formatiert werden würde

(Reduzierte Einrückung, um ein Umwickeln zu vermeiden ...)

oder:

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

Sie könnten sogar die „Herstellung von nicht-primären“ Bit in einem separaten Verfahren, bei dem Sie haben würde Punkt-entpacken:

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

Ich denke nicht, dass Ihre mehrzeiligen Beispiele haben sollten ein Semikolon nach den Where-Anweisungen. –

+0

@Joel: Fest, danke. –

1

Alles, was vertikale oder horizontale Komplexität verringert, ist ein Plus für mich. Darüber hinaus ist die Linq viel aussagekräftiger für das, was Sie erreichen möchten.

2

Das erinnert mich ein bisschen an "sollte ich Regex oder Standard-String-Funktionen verwenden" oder "soll ich XSLT/XPATH verwenden, um XML zu transformieren oder SelectSingleNode()" zu verwenden.

Die erste Option (z. B. Regex/XSLT/Linq) wird von jedem, der etwas Zeit damit verbracht hat, als eleganter und leistungsfähiger angesehen.

Während für alle anderen scheint es weniger lesbar und komplexer im Vergleich zu der zweiten Option (dh. String-Funktionen, SelectSingleNode(), einfache foreach-Schleife).

In der Vergangenheit wurde ich beschuldigt, Dinge mit Regex und XSLT/XPATH in meinem Design zu komplizieren.

Erst vor kurzem wurde ich von zu werden „Angst vor Veränderung“ beschuldigt, durch einfache foreach bevorzugen (und sogar für) Schleifen in vielen Situationen über Linq Wo, Foreach usw.

Ich erkannte bald, dass die Menschen in beiden Fällen die Ich sagte, das war die Sorte, die das Gefühl hat, dass es "den einen Weg" gibt, alles zu tun.

Während ich immer fand es ist viel klüger, jede Situation auf ihre Vorzüge zu betrachten und wählen Sie das richtige Werkzeug für den Job. Ich ignoriere sie einfach und fahre mit meinem Ansatz fort;)

Für diese Situation beschreiben Sie, die erste Option ist mir vorzuziehen. Allerdings würde ich wahrscheinlich den Linq-Ansatz verwenden, wenn mein Team in Linq kompetent wäre, und wir hatten Codierungsrichtlinien, um große Einzeiler zu vermeiden (indem wir sie aufteilen)