1

我有一个类型,它包含一个IEnumerable<T>并包含一些额外的逻辑,实现了一个我们将调用的接口IMyIterable<T>。一方面,我希望人们使用 LINQ 方法来过滤和处理(通过将它们实际应用到底层IMyIterable<T>对象),但另一方面,我仍然希望在已应用 LINQ 方法。例如IMyIterable<T>

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。您可以在 IMyIterable 本身上实现所需的 LINQ 方法(作为实例方法或作为扩展方法)。这样,您甚至可以直接在 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

您能否将 IMyIterable 上的方法实现为 IEnumerable 的扩展方法?不知道这个接口到底做了什么,很难想出一个解决方案。

于 2012-06-09T13:25:06.940 回答
0

您可以在 IMyIterable 上创建一堆等效方法(返回 IMyIterable)并将它们转发到内部 IEnumerable 实例,而不是从 IEnumerable 派生。

然而,围绕一个演员阵容似乎需要做很多工作。我猜您建议的 .Linq() 解决方案可以正常工作。

于 2012-06-09T13:33:01.070 回答