1

をラップし、IEnumerable<T>いくつかの追加ロジックを含むタイプがあり、これを呼び出すインターフェイスを実装していますIMyIterable<T>。LINQメソッドを使用してIMyIterable<T>(実際に基になるオブジェクトに適用することで)フィルタリングと処理を行う必要がある一方で、IMyIterable<T>カスタムインスタンス機能(状態情報など)を流暢に公開したいのですが、 LINQメソッドが適用されました。例えば

var query = myIterable.Select(x => x.whatever);
//query is now of a completely different type than IMyIterable<T>
var result = query.MyCustomThingy(); 
//But I really want MyCustomThingy to work too.

私は解決策が次のようになることを知っています:

var query = myIterable.Linq(x => x.Select(y => y.Whatever));

しかし、余分な括弧は私には見苦しいです。私がこれを行うことができる他の方法はありますか?私は実際にSelect()カスタムクラスを返すメソッドを求めているのではなく(コード生成を含むなど、これを行うためのきちんとした方法があれば、私は間違いなく乗っています)、いくつかのきちんとした構文だけです。

4

3 に答える 3

1

LINQ は IEnumerable に関連付けられていません。必要な LINQ メソッドを IMyIterable 自体に (インスタンス メソッドまたは拡張メソッドとして) 実装できます。このようにして、IMyIterable 型の変数に対して linq 構文を直接使用することもできます。

例えば:

public interface IMyIterable<T>
{
    IMyIterable<TOut> Select<TOut>(Func<T, TOut> selector);
    IMyIterable<T> Where(Func<T, bool> predicate);
    // ...
}

これにより、次のように書くことができます。

 IMyIterable<T> source = ...;

 var query = from item in source 
             where item.X == Y
             select new {...}
于 2012-06-09T13:44:22.453 に答える
0

IEnumerable から派生させる代わりに、IMyIterable で一連の同等のメソッドを作成し (IMyIterable を返す)、それらを内部の IEnumerable インスタンスに転送することができます。

ただし、これはキャストを一周するのに大変な作業のようです。あなたが提案した .Linq() ソリューションは問題なく機能すると思います。

于 2012-06-09T13:33:01.070 に答える
0

代わりに IMyIterable のメソッドを IEnumerable の拡張メソッドとして実装できますか? このインターフェースが何をするのかを正確に知らないと、解決策を考え出すのが難しくなります。

于 2012-06-09T13:25:06.940 に答える