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

时间:2013-07-15 09:14:53

标签: c# linq lambda

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

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

当我想对泛型集合进行操作时出现问题 - 我既不能使用lambda表达式也不能使用LINQ - 我根本就不是 能够放using System.Linq;,因为我无权访问文件头。

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

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

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

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

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

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

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

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

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

3 个答案:

答案 0 :(得分:15)

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

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

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

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

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

答案 1 :(得分:3)

您可以编写此类代码:

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

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

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

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

答案 2 :(得分:2)

不清楚为什么你无法访问文件“标题”,但是如果您无法在文件using的开头输入的问题,那么 仍然可以使用完整的类型的限定名称,如:

System.Linq.Enumerable(...)

为了完成这项工作,您自然需要包含正确的参考资料。

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