是否可以使用Linq和lambdas而不包含System.Linq命名空间?

前段时间,我一直在研究一个相当扭曲的项目 – 我只能在单个范围内编写代码,然后将其放入C#函数(由另一个模块)。

我只能使用之前声明的名称空间(我对它们没有影响)并且只能使用我工作的作用域中的变量。因此,我无法更改标题和包含的库。

当我想操作generics集合时出现问题 – 我既不能使用lambda表达式也不能使用LINQ – 我根本无法using System.Linq; ,因为我无法访问文件头。

我只需做一件简单的事情,没有LINQ或lambda就很容易管理。 但是,之后我想知道会发生什么,如果我不得不在IEnumerable上使用一些更复杂的操作。 从那以后,我的问题出现了:

是否可以在不更改文件头和添加新命名空间的情况下使用LINQ或lambdas?

假设我们有一个List _Numbers = new List(); 。 让它充满一些数字。 现在我想从中选择所有偶数。

using System.Linq; 在标题中,解决方案很明显:

 List _NewList = _Numbers.Where(n => n % 2 == 0).ToList(); 

要么

 List _NewList = (from _Number in _Numbers where _Number % 2 == 0 select _Number).ToList(); 

但是如果不包含LINQ,我该如何实现呢? 我的第一个猜测是这样的:

 List _NewList = System.Linq. // ??? What to add here? 

我知道这个问题很奇特,走这条路是很不寻常的,但我只是很好奇而且我没有找到关于这个案例的信息。

如果没有using指令,则.Where.Select等方法将无法解析。 这意味着LINQ 语言部分将无法正常工作。 你必须长时间(和向后!)编码它:

 List _NewList = System.Linq.Enumerable.ToList( System.Linq.Enumerable.Where(_Numbers, _Number => _Number % 2 == 0) ); 

请注意,对于包含组,订单,“let”,联接等的较长示例,这变得越来越复杂。除非您做的事情相当简单,否则建议您找到添加using指令的方法。

但请注意,如果_NumbersList ,则可以使用(对于此单个示例):

 List _NewList = _Numbers.FindAll(_Number => _Number % 2 == 0); 

你可以写这样的代码:

 System.Linq.Enumerable.Where(_NewList, n => n % 2 == 0) 

但是,要小心:如果你的类实现了接口IQueryable ,上面的代码将完成工作,但速度会慢一些。

 System.Linq.Queryable.Where(_NewList, n => n % 2 == 0) 

因为IQueryable是用其他DSL语言生成C#的方法,比如SQL。 在其他条件下,您的SQL服务器可以尽可能快地选择所需的元素。 但是如果你使用IEnumerableSystem.Linq.Enumerable没有在服务器端进行优化,你将获得一个完整的项目列表,它们都将被加载到内存并在内存中进行过滤。

不太清楚为什么你不能访问文件“header”,但如果你不能在dirrective的文件开头输入的问题,你仍然可以使用该类型的完全限定名称,如:

 System.Linq.Enumerable(...) 

为了使这项工作,您自然需要包括正确的参考。

如果这不是您所要求的,请澄清。