Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 类似于LINQ中jQuery的end()?_C#_.net_Linq - Fatal编程技术网

C# 类似于LINQ中jQuery的end()?

C# 类似于LINQ中jQuery的end()?,c#,.net,linq,C#,.net,Linq,LINQ中是否有类似的函数 所以我可以修改以前选择的结果集?在.NET中没有类似的内容。甚至不能保证IEnumerable可以枚举两次或两个结果相同。通常,每个枚举都会重做查询或其他任何查询。例如,如果您这样做: **代码确实有效,但很糟糕!见下文** var persons = from p in ctx.Persons select p; foreach (var person in persons) { } foreach (var person in persons) { } 如果

LINQ中是否有类似的函数


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

在.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 to对象

还有另一个更具语义的问题: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现在是一个元组。。。从技术上讲,让它以一种类型安全的方式返回元组是非常复杂的,因为在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());
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);
这也没关系,但请记住,您要枚举两次

显然,你可以稳妥行事:

**真正有效的代码**

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());
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);
现在,至少你知道你将枚举两次,可以安全地枚举任意次数

请注意,您可以写:

**真正有效的代码**

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());
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);

但是,每次您要枚举元组的两个枚举数时,您都会再次枚举源,除非您使用ToList,如第二个示例中所示,您在回答的中间给出的.Count.Pop.Count示例,是否有效?我现在没有访问vs的权限,但它看起来不应该编译。我无法从周围的文本看出您是否在谈论一种假设的语法。@AmithGeorge如果您构建了类似jQuery的东西,这就是一个例子。这是为了表明它不会有用。我会澄清的。感谢@xanatos的出色解释和您花时间介绍示例。我认为您对jquery作用于元素的描述非常优雅。似乎let不起作用。它不编译:var q=from i in new[]{1,2,3,4,5}let odd=q.where t=>t%2==1