3

jQuery's end()LINQ中是否有类似功能的东西?

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

4

1 回答 1

4

.NET 中没有类似的东西。甚至不能保证 anIEnumerable<>可以枚举两次(或者两个结果相同)。通常每个枚举都会重做查询(或任何查询)。因此,例如,如果您这样做:

** 真正有效但效果不佳的代码!(见下文) **

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

foreach (var person in persons) { }

foreach (var person in persons) { }

wherectx.Persons是 SQL Server 中的一个表,每个表foreach都会重做查询。

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

还有一个更语义化的问题: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在某些情况下现在是 a Tuple<int, int>(在某种程度上......从技术上讲,让它Tuple<int, int>以类型安全的方式返回 a 将非常复杂,因为在 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(),如第二个示例中所示)

于 2013-09-02T11:47:58.517 回答