jQuery's end()
LINQ中是否有类似功能的东西?
所以我可以修改以前选择的结果集吗?
.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()
,如第二个示例中所示)