LINQを実装するということは、LINQがそこにあると期待するメソッド(Where
またはSelect
、など)を正しい署名で実装することを意味します。IEnumerable
一般的な認識にもかかわらず、 LINQをサポートするためにクラスのインターフェイスを実装する必要はありません。ただし、実装IEnumerable
すると、クラスのLINQメソッドのセット全体がほぼ無料で自動的に取得されます。実装する必要があるのは、クラスと1つだけです。Enumerable
GetEnumerator
IEnumerator
イテレータパターンIEnumerable
についてのこの投稿では、私のブログに実装する方法についていくつかの例があります。
ただし、クラスを列挙可能にすることが意味をなさない場合は、そうする必要はありません。適切なLINQメソッドを直接実装する必要があります。LINQは、C#がコンパイルされる限り、メソッドがどのように定義されるかを実際には気にしません。つまり、次のように記述します。
from p in myPlist where p.Thing == "Thing" select p;
C#コンパイラはこれを次のように変換します。
mpPlist.Where(p => p.Thing == "Thing").Select(p => p);
それがコンパイルされる限り、LINQは機能します。メソッドの正しいシグネチャを確認するには、MSDNドキュメントのLINQクエリメソッドのリストを参照してください。PList
例(あなたがのリストであると仮定しますPListItem
):
public class PList
{
public IEnumerable<PListItem> Where(Func<PListItem, bool> predicate)
{
foreach (var item in this.items)
{
if (predicate(item))
{
yield return item;
}
}
}
}
この方法でLINQを直接実装すると、動作をより細かく制御できますが、正しく実行するにはさらに多くの作業が必要になります。また、戻り値の意味を理解したり、LINQ呼び出しを連鎖させたりする必要があります。クラスの実装IEnumerable
を回避し、C#にすべての作業を任せることができれば、作業ははるかに簡単になります。