概要
Enumerable静的クラスのAsEnumerable拡張メソッドを使用すれば、カスタム演算子とライブラリの標準演算子を使い分けることができるようになります。
日常でたとえると
標準時のマニュアル手順と、異常時のマニュアル手順を使い分ける。
使用に適した状況
カスタム演算子を定義し、標準演算子も使用したい場合。これにより、巧妙なプログラムを組めるようになります。
サンプル
/*---------------------------------------------------------
*
* 変換演算子で列挙子を得て標準メソッドを呼び出す
*
---------------------------------------------------------*/
using System;
using System.Linq;
using System.Collections.Generic;
static class IntList
{
public static IEnumerable Select(
this List<int> source,
Func<List<<nt>, List> selector )
{
Console.WriteLine( "カスタムSelect実行" );
var result =
from v in source
select ( v + 5 );
return result;
}
}
class Sample
{
static void Main( )
{
//データソースを用意
int max = 10;
List values = new List();
for ( int i = 0 ; i < max ; ++i )
values.Add( i );
Console.WriteLine( "データ" );
foreach ( int v in values )
Console.Write( "{0} ", v );
Console.WriteLine( Environment.NewLine );
//カスタムメソッドを使用
var x = values.Select( v => v );
foreach ( int v in x )
Console.Write( "{0} ", v );
Console.WriteLine( Environment.NewLine );
//標準のメソッドを使用
Console.WriteLine(
"標準のSelectメソッドを実行" );
var y = values.AsEnumerable().Select( v => v );
foreach ( int v in y )
Console.Write( "{0} ", v );
Console.WriteLine( Environment.NewLine );
//終了
Console.WriteLine( "サンプル終了。" );
Console.ReadLine();
}
}
名前空間
System.Linq名前空間を参照してください。
解説
LINQによる集合指向プログラミングを行っていても、オブジェクト指向プログラミングの技法が使いないわけではなく、実務では両方を使用します。具体的にいうと、オブジェクト指向プログラミングの発想で、独自の演算子を実装し、デフォルトの動作を変更することが可能となります。
しかしながら、常にカスタム演算子が通用するわけではありません。やはり、デフォルトの動作をしてほしいときがあります。その際に使用するのが、AsEnumerable拡張メソッドです。
このメソッドを使用すれば、列挙子が得られるので、列挙子に対して礼儀されているライブラリの各種標準演算子が使用できるようになります。カスタムとデフォルトの両方を使いこなせるのと非常に心強いので、臨機応変に使いこなせるようになっておくとよいでしょう。
テーマ : プログラミング
ジャンル : コンピュータ