2009-03-28 10 views
2

Ich hätte schwören können, dass es für die Queryable-Klasse bereits eine Erweiterungsmethode gibt, die ich einfach nicht finden kann, aber vielleicht denke ich an etwas anderes.Erweiterung Methode, um einem Feld in jedem Element einen Wert zuzuweisen?

Ich suche nach etwas entlang der Linien von:

IQueryable<Entity> en = from e in IDB.Entities select e; 
en.ForEach(foo => foo.Status = "Complete"); 

en.Foreach() würde wesentlich durchführen:

foreach(Entity foo in en){ 
    foo.Status = "Complete"; 
} 

Ist das schon geschrieben? Wenn nicht, ist es möglich, die Erweiterungsmethode zu schreiben, vorzugsweise unter Berücksichtigung jeder LINQ-Tabelle und jedes Feldes in dieser Tabelle. Wo ist ein guter Anfang?

+0

Was ist Entity-Klasse, eine Klasse von Ihnen definiert. Wenn das der Fall ist, dann musst du die Statuseigenschaft schreiben, oder? –

+0

@gisresearch, die Tatsache, dass er Entity gemacht hat, ist irrelevant. – Samuel

Antwort

1

Es gibt eine foreach auf einer Liste <>. Etwa etwas in diese Richtung:

IQueryable<Entity> en = from e in IDB.Entities select e; 
en.ToList().ForEach(foo => foo.status = "Complete"); 
+0

Da ist es! Ich hatte den Verdacht, dass diese Funktionalität was schon hier war, ich habe einfach nicht an der richtigen Stelle gesucht. Es auf eine Liste zu bringen <> ist vollkommen akzeptabel, und das ist es, was ich brauchte. Danke. – drovani

2
public static void ForEach<T>(this IEnumerable<T> sequence, Action<T> action) 
{ 
    foreach (var item in sequence) 
    { 
     action(item); 
    } 
} 
+0

Ich würde einen anderen Namen vorschlagen, um einen Konflikt auf Listen zu vermeiden. Vielleicht OnEach (..)? – Samuel

+0

@ Samuel, würde ich nicht. Beide Funktionen machen das gleiche, so dass es Ihnen nichts ausmacht, diese Version nicht einfach auf einer Liste aufzurufen. Auf diese Weise können Sie ForEach einfach für IEnumerable'1 verwenden - eine Liste oder nicht. –

+0

Diese Antwort war wirklich hilfreich. Der andere Teil meines Problems war, das Schlüsselwort zu kennen, um meine eigene Extension-Methode zu erstellen, um eine Aktion für jedes Element in einer Sequenz auszuführen. Der Delegierte von "Action" hat mich auf den richtigen Weg gebracht, um die Lösung für alle Arten von Problemen zu vereinfachen. Vielen Dank. – drovani

5

Es gibt nichts in der Bibliothek Basisklasse. Viele, viele Entwickler haben dies in ihrer eigenen gemeinsamen Bibliothek, und wir haben es in MoreLINQ auch.

Es geht irgendwie gegen den Geist von LINQ, in dem es um Nebenwirkungen geht - aber es ist wirklich nützlich, also denke ich, dass Pragmatismus das Dogma hier übertrumpft.

Eine Sache zu beachten - es ist wirklich sinnlos, in Ihrem Beispiel einen Abfrageausdruck zu verwenden. (Es ist nicht vollständig redundant, aber wenn Sie den Wert nicht offen legen, ist es egal.) Die Auswahl tut nichts nützliches hier. Sie können einfach tun:

IDB.Entities.ForEach(foo => foo.status = "Complete"); 

Auch wenn Sie eine einzelne „where“ oder „Kopie“ Ich normalerweise Punktnotation verwenden würde tun wollen:

IDB.Entities.Where(foo => foo.Name == "fred") 
      .ForEach(foo => foo.status = "Complete"); 

Nur Abfrage Ausdrücke verwenden, wo sie tatsächlich machen der Code einfacher :)

+0

Sehr artikulierte Antwort, und ich schätze die Antwort. Der eigentliche Abfrageausdruck ist viel komplizierter; Ich habe es nur für die Einfachheit der Frage reduziert. Danke auch für den Link zu MORELinq. Es gibt viele hilfreiche Dinge, die ich dort gefunden habe. – drovani