【问题标题】:Confusing for loop C#令人困惑的 for 循环 C#
【发布时间】:2012-01-29 17:08:41
【问题描述】:

我正在使用这个循环来检查我的数据库,并检查 player Club 字段是否与 clubAway 变量匹配。在 if 语句中它“发疯了”。

Baza = 数据集

玩家 = 数据库中的表

Club = int 字段

int clubAway

我用消息框检查了这些值,例如:Club = 1 and IDclub = 2.. 但它还是进入了 if 语句。我有完全相同的 for 循环,不同之处在于 clubAway 是 clubHome 并且工作正常。

for (int o = 0; o <= 10; o++)
{
    for (int p = 1; p <= Baza.Players.Count; p++)
    {
        if (Baza.Players[p - 1 + o].Club == clubAway.IDclub)
        {//do something
        }
    }
}

【问题讨论】:

  • "goes bezerk" 不能很好地描述发生的事情。请参阅tinyurl.com/so-hints。我预计会有一个例外,因为p - 1 + o 肯定会超出Baza.Players 的范围。
  • 在监视窗口中是否有类似Baza.Players[p++] 或带有o++ 的内容,因为这些会在单步执行代码时更改值。
  • @JonSkeet 他解释了发生了什么——它忽略了 if 条件并进入了 if 语句的主体。
  • 您可能会添加更多上下文,但从我看来,您似乎只有一个数组 - 为什么要循环两次?
  • o 变量的用途是什么?有一点澄清,我可能可以帮助你。

标签: c# for-loop


【解决方案1】:

我不清楚o 的目的,但也许这段代码会让你走上一个更好的 路径:

var players = Baza.Players.Where(player => player.Club == clubAway.IDclub).Take(11);

    foreach(var p in players){
        //do something with p
    }

更新

在阅读原始帖子下方的 cmets 时,我推断您只是试图在集合中找到与 clubAway 值匹配的 first 实例。如果这是正确的,那么这些代码 sn-ps 之一会更合适(取决于您的业务规则):

var player = Baza.Players.FirstOrDefault(player => player.Club == clubAway.IDclub);

var players = Baza.Players;
foreach(var _player in players){
     var player = _player.FirstOrDefault(p=> p.Club == clubAway.IDclub);
     //Now do something with player.
}

这将返回“玩家”实体。要使用它,您可以这样做(例如):

var playerTeamName = player.teamName;

当然,我不了解您的实际模型,因此您的代码看起来会有所不同,但会遵循该模式。

祝你好运!

【讨论】:

  • 据我所见,o 用于在Where 之后模拟LINQ Take(11)
  • 嗯。它做了同样的事情。我将 foreach 循环放入运行 11 次的 for 循环中。 (感谢您的帖子,我现在学会了这个技巧)
  • DinoVelić--我认为@Tobias 有一个观点,您似乎在模拟单个 LINQ 查询和后续循环可能发生的事情。我将编辑代码以反映这一点,它可能会进一步帮助您,具体取决于您的业务规则。
【解决方案2】:

问题是你正在访问集合中的非法元素。 Baza.Players 的最后一个有效索引是 Baza.Players.Count - 1,但您使用的是 p - 1 + o。在这种情况下,p 可以等于Baza.Players.Count,而o 可以是10

您需要更改for 循环上的保护条件。

for (int p = 1; p - 1 + o < Baza.Players.Count; p++)

【讨论】:

  • 这显然是一个错误,但它不能解释为什么他的调试器会进入if 块,尽管明显违反了if 的条件。
  • @ChrisShain 我相信 OP 正在查看错误的索引,我希望这能阐明这一点。
【解决方案3】:

您的代码可能没有正确编译,而您正在运行“最后一个好版本”。从 Build 菜单中选择“Clean”,然后重试。

我猜调试器连接的二进制文件的源代码与您在 IDE 中看到的代码不同。如果您在开始调试时选择“运行最后一个好版本”,或者如果您附加到从构建输出文件夹以外的位置启动的已运行进程,则可能会发生这种情况。

【讨论】:

    【解决方案4】:

    你的循环逻辑有问题。

    假设最初 o = 0 和 p = 1(第一个循环的第一次迭代和第二个循环的第一次迭代),然后 p-1+o 等于 0,然后 o = 0 和 p = 2(第一次迭代第一个循环和第二个循环的第二个循环)和p-1+o 等于 1。但是稍后当 o = 1(第一个循环的第二次迭代)和 p = 1(第二个循环的第一次迭代)时,p-1+o 再次等于 1 ,因此您实际上是在对同一项目执行任务(Baza.Players[1] 没有明显的原因)。

    我希望这能解决你的问题。

    【讨论】:

    • 我明白你在说什么。但是我在这个循环之前的一行使用了同一个循环,它做了我想要的事情(用 1-11 个数字填充 int 数组。这个循环给了我一个包含所有数字 23 的 int 数组)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-11
    • 1970-01-01
    • 1970-01-01
    • 2017-05-03
    • 2020-03-07
    • 2017-06-22
    • 1970-01-01
    相关资源
    最近更新 更多