.Where()、.All、またはオブジェクト内の他の「特別な」メソッドの少なくとも 1 つのコードを探しています。便利だと思うので、そのような書き方を学びたいです。
また、1 つの質問 - これらのメソッドを含むオブジェクトと含まないオブジェクトがあるのはなぜですか。たとえば、私のクラスでそれらを継承するにはどうすればよいですか?
.Where()、.All、またはオブジェクト内の他の「特別な」メソッドの少なくとも 1 つのコードを探しています。便利だと思うので、そのような書き方を学びたいです。
また、1 つの質問 - これらのメソッドを含むオブジェクトと含まないオブジェクトがあるのはなぜですか。たとえば、私のクラスでそれらを継承するにはどうすればよいですか?
Jon はこれについて、LINQ to Objectsの再実装で詳しく説明しています。「どこ」はパート2です。「全部」はパート10
「これらのメソッドを含むオブジェクトと含まないオブジェクトがあるのはなぜですか。たとえば、私のクラスでそれらを継承するにはどうすればよいですか?」- 標準の LINQ 操作は、IEnumerable<T>
と (別々に)の拡張メソッドとして定義されIQueryable<T>
ます。必要に応じて、独自の型に独自の拡張メソッドを作成することも、通常のインスタンス メソッドだけを作成することもできます。
の非常に基本的な実装はWhere
、反復子ブロックによるものです。Any
は通常の方法です。
public static class SomeUtilityClass {
public static IEnumerable<T> Where<T>(
this IEnumerable<T> source, Func<T,bool> predicate)
{
foreach(var item in source)
{
if(predicate(item)) yield return item;
}
}
public static bool All<T>(
this IEnumerable<T> source, Func<T,bool> predicate)
{
foreach(var item in source)
{
if(!predicate(item)) return false;
}
return true;
}
}
もう 1 つの方法は、ILSpy ツールをダウンロードし、これらの拡張機能を実装する DLL を開くことです。
たとえば、ILSpy で System.Linq を開くだけで、多くの標準実装が表示されます。
おそらく、LINQ プロバイダーを作成する必要があります。これは、Where()、Select() などの LINQ 機能を実装するクラスのタイプです。
しかし、なぜそれが必要なのですか?LINQ to Objects を使用する場合、基本的に作成するコレクションはすべて LINQ をサポートします。
いずれにせよ、LINQ プロバイダーの構築の詳細については、http://msdn.microsoft.com/en-us/library/bb546158.aspx のウォークスルー記事を参照してください。
別の興味深いリンクがあります。Stack Overflow にあります: Implementing your own LINQ & IEnumerable<T>
幸運を!