前段时间,我一直在研究一个非常扭曲的项目 - 我只能在单一范围内编写代码,然后将其放入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?
我知道这个问题很奇特,走这条路是很不寻常的,但我只是很好奇,而且我没有找到关于此案的信息。
答案 0 :(得分:15)
如果没有using
指令,.Where
,.Select
等方法将无法解决。这意味着LINQ 语言部分将无法正常工作。你必须长时间(和向后!)编码:
List<int> _NewList = System.Linq.Enumerable.ToList(
System.Linq.Enumerable.Where(_Numbers, _Number => _Number % 2 == 0)
);
请注意,对于包含组,订单,“let”,联接等的较长示例,这变得越来越复杂。除非您做的事情相当简单,否则建议您找到添加using
的方法指令。
但请注意,如果_Numbers
是List<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服务器可以尽可能快地选择所需的元素。但是如果你使用IEnumerable
或System.Linq.Enumerable
没有在服务器端进行优化,你将获得一个完整的项目列表,它们都将被加载到内存中并在内存中进行过滤。
答案 2 :(得分:2)
不清楚为什么你无法访问文件“标题”,但是如果您无法在文件using
的开头输入的问题,那么 仍然可以使用完整的类型的限定名称,如:
System.Linq.Enumerable(...)
为了完成这项工作,您自然需要包含正确的参考资料。
如果这不是您所要求的,请澄清。