Frage

Zum einen kann ich nicht bekommen, meinen Kopf um die funktionalen / Lambda Aspekte von .NET 3.5. Ich benutze diese alltäglichen Funktionen in LINQ, aber mein Problem, die Umsetzung ist das Verständnis, und was sie wirklich bedeuten (Lambda? System.Func? Etc etc)

In diesem Sinne, wie würden folgendes erreicht werden:

Als Beispiel würde Ich mag eine Erweiterungsmethode für Liste haben (Of T), die die Eigenschaften aller Objekte in der Liste auf einen bestimmten Wert setzt, und gibt die aktualisierte Liste (Of T). Es würde wie folgt aufgerufen werden:

VB:

 Dim someList As List(Of TextBox) =  (New List(Of TextBox)).UpdateExtension(Function(txtb) txtb.Text = "something")

C #:

List<TextBox> someList = (new List<TextBox>()).UpdateExtension(txtb => txtb.Text = "something");

Was wäre die Erweiterung Methode aussehen, sowohl in VB und C #?

heißt:

 <Extension()> _
 Public Function UpdateExtension(Of T)(ByVal source As List(Of T), ByVal predicate As ??) As List(Of T)
        '??
 End Function

Prost!

Bearbeiten

Wie viele haben darauf hingewiesen, kann die oben erreicht, mehr oder weniger sein, mit .ForEach (). Aber mein Interesse ist, in understading, wie so etwas wie .ForEach () implementiert, das heißt ich bin interessiert an der Umsetzung der Lösung für das oben beschriebene Problem.

War es hilfreich?

Lösung

Wirklich Sie Mikrofonierung und Erweiterung passende Methoden hier. Es ist fast eine Kombination von Select und ForEach. Es scheint eine Methode wollen, dass Sie beide können auf Elemente einer Liste ändern und die ursprüngliche Aufzählung zurück. Folgendes sollte den Trick für Sie tun.

VB.Net

<Extension()> _
Public Function UpdateExtension(Of T)(ByVal source As IEnumerable(Of T), ByVal del As Action(Of T)) As IEnumerable(Of T)
  For Each cur in source
    del(cur)
  Next
  Return source
End Function

C #

public static IEnumerable<T> UpdateExtension<T>(this IEnumerable<T> source, Action<T> del) {
  foreach ( var cur in source ) {
    del(cur);
  }
  return source;
}

Andere Tipps

Mit der Ausnahme, dass Sie die Liste an Ort und Stelle ändern würde, anstatt eine neue Rückkehr, das ist nur ein .ForEach() Anruf.

Um wirklich zu verstehen, wie dies funktioniert, denkt mehr in Bezug auf IEnumerables als Listen. Denken Sie darüber nach, warum die beiden Ausdrücke unten haben das gleiche Ergebnis und , warum die letztere ist in der Regel vorzuziehen:

MyEnumerable.Count() > 2
MyEnumerable.Skip(2).Any()

Um dies zu erreichen, neu implementieren einige Standards IEnumerable Erweiterungen unter Verwendung von C # 's yield Schlüsselwort. Sobald Sie wirklich, warum die zweite eine bessere Leistung erhalten, sollten Sie in guter Form sein.

Wie für die verschiedenen Grund Delegattypen, brauchen Sie nur, sie zu erlernen. Denken Sie an Func als Ihre grundlegenden gemeinsamen Delegierten, in dem Sie das Argument Typ und Typ für die generischen Typparametern zurück. Dann denken Sie an Action als Sonderfall von Func wo der Rückgabetyp ist ungültig und Predicate als Sonderfall, wo der Rückgabetyp Bool ist.

Erweiterungen sind in einer statischen Klasse von statischen Methoden implementiert, die das Ziel der Erweiterung als ersten Parameter durch die dieses Schlüsselwort voran nehmen. Zur Umsetzung Ihr Beispiel, das ich tun würde:

public static class ListBoxExtensions
{
  public static List<TextBox> SetToValue(this List<TextBox> txtBoxes, string sValue)
  {
    txtBoxes.ForEach(txtBox => txtBox.Text = sValue);
    return txtBoxes;
  }
}

und dies mit drei Textfeldern auf einem Windows-Formular zu verwenden:

private void Form1_Load(object sender, EventArgs e)
{
  List<TextBox> boxes = new List<TextBox>
                        {
                          textBox1,
                          textBox2,
                          textBox3
                        }.SetToValue("Hello");
}

Sorry -. Nicht VB sprechen

Hope, das hilft.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top