3

まず、.NET 3.5の機能/ラムダの側面について頭を上げることはできません。VB/C/C++でAction/Func/Delegates/Lambdaを使った拡張メソッドを書く#

:どのように次のことが達成されるであろう、心の中で私は、LINQでこれらの機能を毎日使用していますが、私の問題は、実装を理解され、そしてどのような彼らは本当に(ラムダSystem.Funcなどなどを?)を意味する。これにより

例として、List内のすべてのオブジェクトのプロパティを特定の値に設定し、更新されたList(Of T)を返すList(Of T)のExtensionメソッドを用意したいと思います。

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"); 

どの拡張メソッドの外観は、VBとC#の両方で、ご希望ですか?

すなわち:

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

歓声!

EDIT

多くは、上記を達成することができる、多かれ少なかれ、.ForEachと()を指摘しています。しかし、私が興味を持っていることは、.ForEach()のようなものがどのように実装されているか、つまり上記の問題の解決策の実装に興味があることです。

+0

しかし、ForEachはあなたの変数に割り当てることができるテキストボックスのリストを返しません(あなたのサンプルコードでは、とにかく空になります)。 – Benjol

答えて

2

本当にあなたはここでマイクとマッチする拡張メソッドを使用しています。ほぼSelectとForEachの組み合わせです。リストの要素を変更して元の列挙を返すことができるメソッドが必要なようです。以下はあなたのためのトリックを行う必要があります。

VB。ネット

<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#

+0

+ 1うーん...興味深い。私の無知を許してください。そうすれば、ラムダ式を表現することで、メソッド呼び出しで "obj => obj.date = Now"と表現することで、実装では、そのdelegate/action/funcを実行するだけです。 – andy

+0

@andyはい。このバージョンでは、コレクション内のオブジェクトごとに1回実行されます。 – JaredPar

+0

それはIEnumerableの "yield return"ですか? – Benjol

2

新しいリストを返すのではなく、その場所でリストを変更することを除いて、これはちょうど.ForEach()コールです。

これがどのように機能するかを実際に理解するには、リストよりもIEnumerableの点でもっと考えてください。後者は一般的に好ましい理由を以下の2つの式は同じ結果を持っている理由を考えてみて:

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

にC#のyieldキーワードを使用して、いくつかの標準的なIEnumerableを拡張を再実装し、これを実現するのに役立ちます。第2弾がなぜ優れているのか分かると、良い体質になっているはずです。

さまざまな基本デリゲートタイプについては、それらを習得するだけです。 Funcを基本的な共通の代理人と考えてください。そこではジェネリック型パラメータの引数の型と戻り値の型を指定します。次に、Actionを戻り値の型がvoidであるFuncの特別なケースとみなし、戻り型がboolの特別な場合としてPredicateと考えます。

+0

+1よろしくお願いします。Joel、さまざまなデリゲートタイプのヘッドに感謝します。単に英語で説明しておくと便利です。私はあなたが何を意味するのかを見ます。すべて()、しかし、とにかく私はどのように正確に実装されていることを示すことができますか?私はちょうどあなたが知っていることを理解し始めるためにそれを見る必要がある、歓声 – andy

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

拡張は、このキーワードが先行する最初のパラメータとして拡張の対象を取る静的メソッドにより静的クラスに実装されています。私はどうしたらあなたの例を実装するには:

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

および3つのテキストボックスを使用してWindowsフォーム上でこれを使用する:

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

申し訳ありません - VBを話すことはありません。

これが役に立ちます。

+0

笑を返そうとしました。問題はありません。ちょうどC#を始めました。冷たい、私はForEachを気づいていなかったが、私は、ForEachのようなものがexrameleのように – andy

関連する問題