LINQ中是否有与jQuery's end()
函数类似的内容?
所以我可以修改之前选择的结果集吗?
答案 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()
,如第二个例子所示)