我的一位同事带着一个关于这种方法的问题来找我,导致无限循环.实际的代码有点过于介绍这里,但基本上问题归结为:
private IEnumerable<int> GoNuts(IEnumerable<int> items)
{
items = items.Select(item => items.First(i => i == item));
return items;
}
Run Code Online (Sandbox Code Playgroud)
这应该(你会认为)只是一种非常低效的方式来创建列表的副本.我叫它:
var foo = GoNuts(new[]{1,2,3,4,5,6});
Run Code Online (Sandbox Code Playgroud)
结果是无限循环.奇怪.
我认为修改参数在风格上是一件坏事,所以我稍微改了一下代码:
var foo = items.Select(item => items.First(i => i == item));
return foo;
Run Code Online (Sandbox Code Playgroud)
那很有效.也就是说,该计划已经完成; 没有例外.
更多实验表明这也有效:
items = items.Select(item => items.First(i => i == item)).ToList();
return items;
Run Code Online (Sandbox Code Playgroud)
一样简单
return items.Select(item => .....);
Run Code Online (Sandbox Code Playgroud)
好奇.
很明显,问题与重新分配参数有关,但仅限于评估延迟超出该语句.如果我添加ToList()它的工作原理.
对于出了什么问题,我有一个普遍的,模糊的想法.它看起来像是在Select迭代它自己的输出.这本身有点奇怪,因为IEnumerable如果它迭代的集合发生变化,通常会抛出.
我不明白,因为我并不熟悉这些东西如何工作的内部,这就是重新分配参数导致这个无限循环的原因.
是否有人对内部人员有更多的了解谁会愿意解释为什么无限循环发生在这里?
当您在Chrome中的jsfiddle中获得无限循环时,您唯一的选择(我知道)是关闭选项卡.当然,这意味着您在当前窗口中丢失了所有工作!是否有一种简单的方法可以阻止无限执行的脚本?
这一切都是因为我决定在我的循环中交换方向
for (var c = 0; c <= 11; c++)
Run Code Online (Sandbox Code Playgroud)
至
for (var c = 12; c > 0; c++)
Run Code Online (Sandbox Code Playgroud)
但正如你在上面所看到的,我忘了将它c++改为c--.
有任何想法吗??我仍然打开标签,我希望在不关闭标签的情况下取回标签:-)
编写无限循环很简单:
while(true){
//add whatever break condition here
}
Run Code Online (Sandbox Code Playgroud)
但这会破坏CPU的性能.此执行线程将尽可能多地从CPU的电源中获取.
降低对CPU影响的最佳方法是什么?添加一些Thread.Sleep(n)应该可以解决问题,但为Sleep()方法设置高超时值可能表示对操作系统的应用程序无响应.
假设我需要在控制台应用程序中每分钟执行一次任务.我需要继续Main()在"无限循环"中运行,而计时器将触发将完成工作的事件.我想保持Main()对CPU的最小影响.
你有什么方法可以建议.Sleep()可以,但正如我已经提到的,这可能表明操作系统没有响应.
后期编辑:
我想更好地解释一下我在寻找什么:
我需要一个控制台应用程序不是Windows服务.控制台应用程序可以使用Compact Framework模拟Windows Mobile 6.x系统上的Windows服务.
只要Windows Mobile设备运行,我需要一种方法让应用程序保持活动状态.
我们都知道控制台应用程序运行只要其静态Main()函数运行,所以我需要一种方法来阻止Main()函数退出.
在特殊情况下(例如:更新应用程序),我需要请求应用程序停止,因此我需要无限循环并测试某些退出条件.例如,这就是为什么Console.ReadLine()我没用.没有退出条件检查.
关于上面,我仍然希望Main()函数尽可能地对资源友好.让我们确定检查退出条件的函数的指纹.
有没有之间的PHP任何差异while(true)和for(;;)除了语法和可读性?
编辑:我不认为这是重复 - 我想知道PHP特有的答案.就发动机而言,有什么真正的区别吗?他们编译成同样的东西吗?他们有同等的表现吗?
编辑2:我也不会认为相对表现和相关的OpCodes是基于意见.可读性存在意见空间,但这显然不是问题.
我正在尝试在Python中创建无限循环的各种方法(除了通常之外while True),并提出了这个想法:
x = {0: None}
for i in x:
del x[i]
x[i+1] = None # Value doesn't matter, so I set it to None
print(i)
Run Code Online (Sandbox Code Playgroud)
在纸面上,我找到了无限循环的方式:
+ 1将是具有None更新字典的值的新键.在我看来,这应该以一种无限循环的方式输出自然数:
0
1
2
3
4
5
.
.
.
Run Code Online (Sandbox Code Playgroud)
我认为这个想法很聪明,但是当我在Python 3.6上运行时,它会输出:
0
1
2
3
4
Run Code Online (Sandbox Code Playgroud)
是的,它在5次迭代后以某种方式停止了.显然,循环的代码块中没有基本条件或标记值,那么为什么Python只运行此代码5次?
假设我有一个在无限循环中提供某种功能的对象。
将无限循环放在构造函数中是否可以接受?
例子:
class Server {
public:
Server() {
for(;;) {
//...
}
}
};
Run Code Online (Sandbox Code Playgroud)
或者如果构造函数永远不会完成,C++ 中是否存在固有的初始化问题?
(这个想法是运行你刚才说的服务器Server server;,可能在某个线程中......)
我开始学习Prolog,并首先了解了继承符号.
这就是我在Prolog中发现编写Peano公理的地方.
参见PDF的第12页:
sum(0, M, M).
sum(s(N), M, s(K)) :-
sum(N,M,K).
prod(0,M,0).
prod(s(N), M, P) :-
prod(N,M,K),
sum(K,M,P).
Run Code Online (Sandbox Code Playgroud)
我把乘法规则放到了Prolog中.然后我做查询:
?- prod(X,Y,s(s(s(s(s(s(0))))))).
Run Code Online (Sandbox Code Playgroud)
这意味着基本上找到6的因子.
结果如下.
X = s(0),
Y = s(s(s(s(s(s(0)))))) ? ;
X = s(s(0)),
Y = s(s(s(0))) ? ;
X = s(s(s(0))),
Y = s(s(0)) ? ;
infinite loop
Run Code Online (Sandbox Code Playgroud)
这个结果有两个问题:
所以...我的问题是:
我在无限循环中阅读了另一个答案.但我很感激有人根据这个场景做出回答.这对我很有帮助.
prolog infinite-loop successor-arithmetics non-termination failure-slice
Java中无限循环的约定是什么?我应该写while(true)还是for(;;)?我个人会使用,while(true)因为我经常使用while循环.
有人可以解释为什么这段代码在无限循环中运行?为什么总是MoveNext()回来true?
var x = new { TempList = new List<int> { 1, 3, 6, 9 }.GetEnumerator() };
while (x.TempList.MoveNext())
{
Console.WriteLine("Hello World");
}
Run Code Online (Sandbox Code Playgroud) infinite-loop ×10
c# ×3
c++ ×2
.net ×1
c ×1
constructor ×1
conventions ×1
dictionary ×1
enumerator ×1
for-loop ×1
java ×1
javascript ×1
jsfiddle ×1
linq ×1
loops ×1
php ×1
prolog ×1
python ×1
while-loop ×1