【问题标题】:C# foreach loop works only with last itemC# foreach 循环仅适用于最后一项
【发布时间】:2014-03-02 23:28:45
【问题描述】:

所以我在 C# (XNA) 中有以下代码

foreach (Target i in Target.List)
{
      //just distance calculating with pythagoras
      if (Math.Sqrt(Math.Pow((Tpos.X - i.pos.X), 2) + Math.Pow((Tpos.Y - i.pos.Y), 2)) <= 100)
      {
           intersect = true;
      }
      else
      {
           intersect = false;
      }
}

每个“目标”都是这样创建的:

Tower.List.Add(new Tower(Tpos));

问题在于它似乎只适用于最后创建的目标。但是它们中的每一个都可以通过类似的 foreach 循环正确绘制。

有什么不同?

【问题讨论】:

  • 您是否正在将 intersect 复制到某个集合,因为如果没有,那么它只会被每次覆盖
  • 请解释您使用此循环的目的是什么。找到第一个相交的目标?搜索所有目标是否相交?循环的工作原理似乎有点混乱

标签: c# list foreach


【解决方案1】:

我假设您只想测试列表中的 Target 是否与变量 Tpos 相交。

您应该在循环之前使用false 初始化intersect,在循环内部,只需删除else 语句。

这样,如果一个元素不相交但你的intersect变量已经设置为true,它不会将它重置为false。

此外,您可能希望在您执行intersect = true 之后在您的if 中添加一个break 语句,因为一旦您找到一个与您的Tpos 相交的Target,您就不需要测试是否其余数据确实相交:

foreach (Target i in Target.List)
{
      //just distance calculating with pythagoras
      if (Math.Sqrt(Math.Pow((Tpos.X - i.pos.X), 2) + Math.Pow((Tpos.Y - i.pos.Y), 2)) <= 100)
      {
           intersect = true;
           break;
      }
}

【讨论】:

  • @user3241476 没错!感谢您接受答案!
  • 无关提示:计算 Sqrt 很昂贵,您知道如何消除它并使用 10000 而不是 100?
【解决方案2】:

我可能是错的,但这可能与您只输出到一个变量这一事实有关,因此它会被每个循环覆盖。

即

intersect = true; intersect = false;

因此 intersect = false。

编辑:尝试写入列表中的变量。这样你就可以拥有同一个变量的多个副本。

【讨论】:

  • 史蒂夫打败了我 :)
猜你喜欢
  • 1970-01-01
  • 2016-08-24
  • 1970-01-01
  • 2021-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-27
  • 1970-01-01
相关资源
最近更新 更多