类似于jQuery';LINQ中的s end()

本文关键字:end 中的 LINQ jQuery 类似于 | 更新日期: 2023-09-27 18:29:50

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

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

类似于jQuery';LINQ中的s end()

.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(),如第二个示例所示)