C# 调用LINQ方法后调用实例方法的简明语法

C# 调用LINQ方法后调用实例方法的简明语法,c#,linq,extension-methods,C#,Linq,Extension Methods,我有一个类型,它包装了一个IEnumerable,并包含一些额外的逻辑,实现了一个我们称之为IMyIterable的接口。一方面,我希望人们使用LINQ方法来过滤和处理IMyIterable(通过将它们实际应用到底层对象),但另一方面,我仍然希望在应用LINQ方法后,能够流畅地公开IMyIterable的自定义实例功能(例如状态信息)。e、 g var query = myIterable.Select(x => x.whatever); //query is now of a compl

我有一个类型,它包装了一个
IEnumerable
,并包含一些额外的逻辑,实现了一个我们称之为
IMyIterable
的接口。一方面,我希望人们使用LINQ方法来过滤和处理
IMyIterable
(通过将它们实际应用到底层对象),但另一方面,我仍然希望在应用LINQ方法后,能够流畅地公开
IMyIterable
的自定义实例功能(例如状态信息)。e、 g

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.

但是额外的括号对我来说不合适。我还有别的办法吗?实际上,我并不是要求方法
Select()
返回一个自定义类(尽管如果有很好的方法可以实现这一点,例如涉及代码生成,我肯定会支持),只是一些更简洁的语法

您能否将IMyIterable上的方法改为IEnumerable的扩展方法?由于不知道该接口的具体功能,因此很难找到解决方案。

您能否将ImyInterable上的方法实现为IEnumerable的扩展方法?由于不知道该接口的具体功能,因此很难找到解决方案。

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


然而,这似乎是一个演员周围的很多工作。我想您建议的.Linq()解决方案可以正常工作。

您可以在IMyIterable(返回IMyIterable)上创建一组等价的方法,而不是从IEnumerable派生,然后将它们转发到内部IEnumerable实例


然而,这似乎是一个演员周围的很多工作。我想您建议的.Linq()解决方案可以使用。

Linq与IEnumerable没有关联。您可以在IMyIterable本身上实现所需的LINQ方法(作为实例方法或扩展方法)。这样,您甚至可以直接在IMyIterable类型的变量上使用linq语法

例如:

公共接口不可交互
{
不可交互选择(功能选择器);
不可替换的Where(Func谓词);
// ...
}
这将允许您编写如下内容:

 IMyIterable<T> source = ...;

 var query = from item in source 
             where item.X == Y
             select new {...}
imyiterablesource=。。。;
var query=来自源中的项
其中item.X==Y
选择新{…}

LINQ不与IEnumerable绑定。您可以在IMyIterable本身上实现所需的LINQ方法(作为实例方法或扩展方法)。这样,您甚至可以直接在IMyIterable类型的变量上使用linq语法

例如:

公共接口不可交互
{
不可交互选择(功能选择器);
不可替换的Where(Func谓词);
// ...
}
这将允许您编写如下内容:

 IMyIterable<T> source = ...;

 var query = from item in source 
             where item.X == Y
             select new {...}
imyiterablesource=。。。;
var query=来自源中的项
其中item.X==Y
选择新{…}

这是不可能的<代码>IMyIterable具有自定义实例功能。这实际上是不可能的<代码>IMyIterable具有自定义实例功能。哦!我不知道。尽管如此,我还是希望我能以某种方式避免实现大量的一行程序!我不知道。尽管如此,我还是希望我能以某种方式避免实现大量的一行程序。
 IMyIterable<T> source = ...;

 var query = from item in source 
             where item.X == Y
             select new {...}