类似于jQuery';LINQ中的s end()
本文关键字:end 中的 LINQ jQuery 类似于 | 更新日期: 2023-09-27 18:29:50
LINQ中是否有类似jQuery'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()
,如第二个示例所示)