类似于LINQ中的jQuery的end()?

时间:2013-09-02 11:42:32

标签: c# .net linq

LINQ中是否有与jQuery's end()函数类似的内容?

所以我可以修改之前选择的结果集吗?

1 个答案:

答案 0 :(得分:4)

.NET中没有类似的东西。甚至没有保证IEnumerable<>可以枚举两次(或者两个结果是相同的)。通常,每个枚举都将重做查询(或其任何内容)。例如,如果你这样做:

**真正起作用的代码,但是很糟糕! (见下文)**

var persons = from p in ctx.Persons select p;

foreach (var person in persons) { }

foreach (var person in persons) { }

其中ctx.Persons是SQL Server中的表,每个foreach都将重做查询。

我认为在.NET(缓存堆栈枚举器)中构建类似的东西是可能的,但是您必须重写所有LINQ方法(这仅适用于LINQ到对象)

还有另一个问题,更多语义:LINQ是查询的语言,没有ForEach方法。 jQuery的方法是不同的。它们“操作”查询返回的项目。因此,在.NET中,这样的事情唯一“正确”的地方就是能够为同一个查询设置多个结果集...类似于:

**代码不工作,仅作为示例**

var res = (from p in myItems select p).StackfulEnumerable()
                                      .Count(p => p.SomeProperty == 1)
                                      .Pop() // like the End() of jquery
                                      .Count(p => p.SomeProperty == 2);
某些内容中的

res现在是Tuple<int, int>(在某种程度上......从技术上讲,以类型安全方式返回Tuple<int, int>会非常复杂,因为在C#中,你不能用可变数量的参数构建类型安全的泛型方法)

现在,显然有人可以做到这一点:

**真正起作用的代码**

var enu = // my enumerable

var res = from p in new[] { enu }
          let res1 = p.Where(q => q.Prop == 1)
          let res2 = p.Where(q => q.Prop == 2)
          select Tuple.Create(res1.ToArray(), res2.ToArray());

并且没关系,但请记住,您要两次枚举enu

显然你可以安全地玩:

**真正起作用的代码**

var res = from p in new[] { enu.ToList() }
          let res1 = p.Where(q => q.Prop == 1)
          let res2 = p.Where(q => q.Prop == 2)
          select Tuple.Create(res1.ToArray(), res2.ToArray());

现在至少你知道你会列举两次可以安全列举你想要的任何次数。

请注意,您可以写:

**真正起作用的代码**

          select Tuple.Create(res1, res2);

但是每次你枚举Tuple的两个枚举时,你会再次枚举“来源”(除非你使用了ToList(),如第二个例子所示)