- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
有人可以解释为什么这段代码在无限循环中运行吗?为什么 MoveNext()
总是返回 true
?
var x = new { TempList = new List<int> { 1, 3, 6, 9 }.GetEnumerator() };
while (x.TempList.MoveNext())
{
Console.WriteLine("Hello World");
}
最佳答案
List<T>.GetEnumerator()
返回可变值类型 ( List<T>.Enumerator
)。您将该值存储在匿名类型中。
现在,让我们看看它做了什么:
while (x.TempList.MoveNext())
{
// Ignore this
}
相当于:
while (true)
{
var tmp = x.TempList;
var result = tmp.MoveNext();
if (!result)
{
break;
}
// Original loop body
}
现在请注意我们所说的 MoveNext()
on - 匿名类型值的副本。您实际上无法更改匿名类型中的值 - 您所拥有的只是一个可以调用的属性,它将为您提供该值的副本。
如果将代码更改为:
var x = new { TempList = (IEnumerable<int>) new List<int> { 1, 3, 6, 9 }.GetEnumerator() };
...那么您最终会得到一个匿名类型的引用。对包含可变值的框的引用。当您调用 MoveNext()
在该引用上,框中的值将发生变化,因此它将执行您想要的操作。
对于非常相似的情况的分析(再次使用 List<T>.GetEnumerator()
)参见 my 2010 blog post "Iterate, damn you!" .
关于c# - Enumerator.MoveNext() 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31591238/
.NET 应用程序崩溃并显示堆栈跟踪: 调用堆栈: Layouts!Layouts.Ribbon.SizeAndPositionControlViewModel+OnLayoutSelectionCh
我有一个简单的代码如下: foreach ($someFile in Get-ChildItem) { if (($someFile.Name.Substring(0,1) -eq "R")
IEnumerator.MoveNext() 的实现是否预计会相对较快?或者如果“移动到下一项” 包括磁盘 IO、Web 请求或其他可能长时间运行的操作是否可以? 例如,我正在处理一个处理文档的项目,
我是 c# 的新手,我知道必须实现接口(interface)中定义的方法 但在下面的代码中我没有实现 MoveNext() 方法 static void Main() { List list
在集合上使用 Linq,哪个最适合发现集合不为空? HasChild = Childs.GetEnumerator().MoveNext() ? true : false; 和 HasChild =
使用 log4net 声明为: private readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod(
有人可以解释为什么这段代码在无限循环中运行吗?为什么 MoveNext() 总是返回 true? var x = new { TempList = new List { 1, 3, 6, 9 }.Ge
我正在努力实现 100% 的代码覆盖率。然而,代码覆盖以某种方式提示某些未涵盖的 MoveNext() 方法,但是,没有迭代 IEnumerable 的代码路径... 关于如何覆盖 MoveNext
我正在努力实现 100% 的代码覆盖率。然而,代码覆盖以某种方式提示某些未涵盖的 MoveNext() 方法,但是,没有迭代 IEnumerable 的代码路径... 关于如何覆盖 MoveNext
我有一个 WebAPI它具有以下代码段,其中在使用我的记录器记录的 try 块中编写的代码中存在 Null 引用异常。 但是在TargetSite的Exception登录,我收到 无效 MoveNex
我是 IL 的新手,但据我所知,MoveNext 应该在 Current 之前调用,假设我们有这样的 foreach 语句: foreach (var i in Enumerable.Empty())
考虑以下代码: List list = new List(); IEnumerable enumerable = list; IEnumerator enumerator = enumerable.G
我正在使用 crm Dynamics 365 许可 我有 BPF(业务流程) 我想使用 javascript 前进到最后一个阶段,但它仅使用此代码移动一个阶段: for (var i = 0; i <
我试图在下面的示例中获取异常堆栈跟踪的最内部方法名称。由于未知原因,我总是得到 MoveNext 方法名称,而不是真实名称。我该如何解决? var st = new StackTrace(ex, tr
构建二叉搜索树后BST其中包括 BSTNode我正在尝试为其实现 IEnumerable 接口(interface)。 这就是我构建 BSTNodeEnumrator 的方式: public clas
我正在使用 MongoDB 实现 PubSub。如果我创建查询并指定带有 NoCursorTimeout 的 TailableCursor: using(var enumerator = _Colle
下面的代码不会抛出,即使在枚举过程中修改了枚举集合。 using System; using System.Collections; using System.Runtime.CompilerServ
你好, 我在使用一些简单的 VBA 时遇到了问题。我编写了一个脚本来进行文本查询(没有输入参数,因此没有真正的用户交互、SQL 注入(inject)等),针对数据库运行它,并将其转储到新的工作表中。这
This thread表示 LINQ 的 OrderBy 使用快速排序。考虑到 OrderBy 返回一个 IEnumerable,我正在努力理解它的意义。 我们以下面这段代码为例。 int[] arr
我正试图找出我们代码中的错误。我把它归结为下面的片段。在下面的示例中,我有一个 int 网格(行列表),但我想找到具有 1 的列的索引。其实现是为每一行创建一个枚举器,并逐步遍历每一列通过保持普查员步
我是一名优秀的程序员,十分优秀!