请查看以下代码:
var list = new List<MyClass>();
...
var selection = list
.Preprocess()
.Where(x => x.MyProperty = 42)
.ToList();
我想以这样的方式实现Preprocess
,它可以处理后面的谓词所选择的每个项目。因此,如果list
包含数千个对象,我不希望Preprocess
处理所有对象,而只需处理Where
子句选择的那些对象。
我知道这听起来好像将Preprocess
移到查询的末尾会更好,但我有理由这样做。
IQueryable<T>
可以吗?或者它的行为类似于IEnumerable
,其中整个LINQ到对象管道是严格顺序的?
答案 0 :(得分:1)
出于您的目的,此处的IQueryable
与IEnumerable
没有区别,正如您所说的那样,纯粹是顺序的。在您调用Where()
之后,您实际上没有原始&#34;集合&#34;。
现在,你可以理论上做你想做的事,但这需要滚动你自己的LINQ&#34;。 Preprocess()
可能会返回某种PreprocessedEnumerable
,所有自定义运算符都会附加到该ToList()
,最终的for
会对调用进行重新排序。