7

前段时间,我一直在从事一个非常扭曲的项目——我只能在单个范围内编写代码,然后将其放入 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?

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

4

3 回答 3

17

如果没有该using指令,像.Where, .Select, 之类的方法将无法解析。这意味着语言部分的 LINQ将不起作用。您将不得不对其进行长期编码(并且向后编码!):

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

请注意,对于具有组、订单、“让”、连接等的较长示例,这会变得越来越复杂。除非您做的事情相当简单,否则最好找到一种添加using指令的方法。

但是请注意,如果_Numbers是 a List<T>,您可以只使用(对于这个单个示例):

List<int> _NewList = _Numbers.FindAll(_Number => _Number % 2 == 0);
于 2013-07-15T09:20:24.437 回答
3

您可以编写这样的代码:

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

但是,请注意:如果您的类实现了 interface IQueryable<T>,上面的代码将完成这项工作,但速度会更慢。

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

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

于 2013-07-15T09:24:50.510 回答
2

不是很清楚为什么你不能访问文件“header”,但是如果你不能在文件的using开头输入指令,你仍然可以使用该类型的完整限定名,例如:

System.Linq.Enumerable(...)

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

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

于 2013-07-15T09:17:49.457 回答