如何使FOR循环向后?得到一些错误

时间:2016-02-24 23:13:12

标签: c# .net winforms

for (int i = uids.Count; i > 0; i--)
{
    counting += 1;
    if (counting == 30)
        break;
    string currentUidOnServer = uids[i - 1];
    if (!seenUids.Contains(currentUidOnServer))
    {
        OpenPop.Mime.Message unseenMessage = client.GetMessage(i + 1);
        newMessages.Add(unseenMessage);
        seenUids.Add(currentUidOnServer);
        allMessages.Add(unseenMessage);
        int nProgress = (uids.Count - i + 1) * 100 / uids.Count;
        backgroundWorker1.ReportProgress(nProgress, client.GetMessageCount().ToString() + "/" + i);
    }
}

变量uids包含7038个项目。 我想向backgroundworker progresschanged事件报告。 它确实报告但它从7038和100%开始向后 我希望它从0%到100%报告所以我将FOR更改为

for (int i = uids.Count; i > 0; i--)

for (int i = 0; i < uids.Count; i++)

索引异常的第一个错误是在行

string currentUidOnServer = uids[i - 1];

所以我把它改成了[i - 1]

现在我在线上获得例外

OpenPop.Mime.Message unseenMessage = client.GetMessage(i + 1);

自7038 + 1不存在。 所以我把它搞砸了。

这两行如何/有异常应该是?

4 个答案:

答案 0 :(得分:4)

这是执行此操作的典型方法:     for(int i = uids.Count - 1; i&gt; = 0; i - )

然后,使用uids[i]client.GetMessage(i),但我不知道,&#34;客户&#34;在你的代码中

答案 1 :(得分:1)

C#中的数组(以及所有其他类C语言)是零索引的,这意味着数组中的第一项位于位置0.尝试访问小于0或大于或等于的数组索引等于数组中元素的数量将导致您看到的错误。

循环的第一种形式:

for (int i = uids.Count; i > 0; i--)

...从7038到1生成一系列数字(在你的7038项目数组上)。由于7038是一个无效的数组索引(超过数组末尾1)并且序列不包括0,循环中的数组访问表达式都使用i -1将整个序列向下移动1。

要正确反转for而不更改任何其他代码,您需要生成从1到7038的序列,如下所示:

for (int i = 1; i <= uids.Count; i++)

这是你原作的直接相反形式。

我个人更喜欢循环变量大多数时候都是数组索引,当我在> 0语句中看到for条件时,我的第一直觉就是有人忘了放{ {1}} in。

答案 2 :(得分:0)

您可以使用Array.reverse()反转您的数组,然后根据您的原始方法使用i ++迭代它

哎呀我认为这是JavaScript问题大声笑,我说的方法在概念上可以应用于任何语言,只需要为您的语言找到反向的数组

答案 3 :(得分:0)

如果我理解正确,原来i从0变为uids.Count - 1。如果您可以回到那种情况,那么nProgress的公式应为

int nProgress = (i + 1) * 100 / uids.Count;