メインメニューを開く

差分

Linqのメソッドを追加してみる

113 バイト追加, 2019年7月26日 (金) 16:54
「標準のクラスにメソッドを追加する」を参考にクラスを追加するよ。
<source syntaxhighlight lang="csharpC#">
public static class IEnumerableEx
{
}
</sourcesyntaxhighlight>
今回は「<nowiki>IEnumerable<T></nowiki>」に追加するのでクラス名は「IEnumerableEx」にしたよ。
ジェネリックメソッドっていきなり出てきたけど…C#をコーディングしていると時々「<nowiki><T></nowiki>」ってやつに出くわすと思うんだ。(IEnumerableも<nowiki>IEnumerable<T></nowiki>ってなってるよね。…厳密に言うとこれはジェネリッククラスだけど…)これを利用するんだよ。コーディングするときは「T」を型のようにしてコーディングするんだよ。
<source syntaxhighlight lang="csharpC#">
public static class IEnumerableEx
{
}
}
</sourcesyntaxhighlight>
返却する値がないので「void型」でForEachの要素の型が不明なので「<nowiki><T></nowiki>」を使って…引数「source」には「IEnumerable」自身が渡されるんだよね。
細かい話はほかのHPに譲って(笑)前出の関数に引数を追加するよ。
<source syntaxhighlight lang="csharpC#">
public static class IEnumerableEx
{
}
}
</sourcesyntaxhighlight>
「Action<nowiki><T></nowiki>」なんてものが出てきたけど、これは標準で提供されているデリゲートの1つなんだよ。メソッドからの戻り値が必要ない場合は「Action」、戻り値が必要な場合は「Func」を使うくらいに覚えておけばいいと思うんだ。
さて…T型の配列とどのメソッドを呼ぶのかがわかったので、処理を実装するよ。細か説明はコードの後でするね。
<source syntaxhighlight lang="csharpC#">
public static class IEnumerableEx
{
}
}
</sourcesyntaxhighlight>
引数「source」はT型の配列ってことだから…「foreach」で1つひとつの要素にアクセスしているんだ。引数「action」はどのメソッドを呼び出せば良いのか知っているので、「action」に「sourceの1つひとつの要素」を渡せば良いってことになるんだ。「action(item)」は「itemのactionに登録されているメソッドを呼び出してね」って意味になるんだよ。
=== 今まで ===
<source syntaxhighlight lang="csharpC#">
private void Button_Click(object sender, RoutedEventArgs e)
{
}
}
</sourcesyntaxhighlight
=== 拡張メソッドを利用 ===
<source syntaxhighlight lang="csharpC#">
private void Button_Click(object sender, RoutedEventArgs e)
{
l_TestDataTableRows.ForEach(x => x.Delete());
}
</sourcesyntaxhighlight>
テーブルアダプターでFillをしていないとんでもないソースだけど…今までは「foreach」ステートメントを利用しないといけなかったのが、一行ですむようになってるんだ。
今度は配列の値を利用したメソッドを追加してみるよ。前出の説明にあったように「Func」を使うよ。
<source syntaxhighlight lang="csharpC#">
public static class IEnumerableEx
{
}
}
</sourcesyntaxhighlight>
使うときはこんな感じだよ。
<source syntaxhighlight lang="csharpC#">
private void Button_Click(object sender, RoutedEventArgs e)
{
Double l_StdDev = l_TestDataTableRows.StdDev(x => x.DataColumn4);
}
</sourcesyntaxhighlight>
こんな感じになるんだ。「[[標準偏差を計算してみる]]」に掲載した処理を型ごとにコーディングするより、こっちのほうがずっと便利だよね。