【发布时间】:2013-09-11 14:39:27
【问题描述】:
前段时间,我一直在从事一个非常扭曲的项目 - 我只能在单一范围内编写代码,然后将其放入 C# 函数中(由另一个模块)。
我只能使用之前声明的命名空间(我对它们没有影响),并且只能使用我工作范围内的变量。 因此,我无法更改标题和包含的库。
当我想对泛型集合进行操作时,问题就出现了——我既不能使用 lambda 表达式,也不能使用 LINQ——我根本就没有
可以放 using System.Linq; ,因为我无法访问文件头。
我只需要做一件简单的事情,而且不用 LINQ 或 lambda 也很容易管理。然而,在那之后我想知道会发生什么,如果我不得不使用一些 IEnumerable 上更复杂的操作。 由此,我的问题出现了:
是否可以在不更改文件头和添加新命名空间的情况下使用 LINQ 或 lambda?
假设我们有一个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?
我知道这个问题相当奇特,走这条路很不寻常,但我只是好奇,我没有找到关于这个案例的信息。
【问题讨论】:
-
System.Linq.Enumerable.Where(_NewList, n => n % 2 == 0) -
@nsinreal - 谢谢,这正是我想要的。将其添加为答案,我会将其标记为正确;)
-
您还可以在类的命名空间声明中包含“使用”语句。这仍然超出您可以访问的范围吗?
-
@JeppeStigNielsen,不,在
Queryable类中。有区别,Enumerable 类方法接受Funcs(编译后的代码),Queryable类方法接受Expression<Func<..>>(代码存储为抽象语法树,可以重写/处理/等) -
@nsinreal 是的,我知道,这就是我编写 Linq-to-Objects 的原因。当您查询的“源”只是托管内存中的
List<>时,您可以使用委托和Enumerable方法。当然,如果您查询诸如 SQL 数据库之类的东西,您会将 lambdas 保存为表达式树,并让一些神奇的“机器”将表达式转换为数据库服务器能够理解的真正 SQL。然后使用Queryable静态类中的方法。