获得例外索引超出范围。仍然无法弄清楚如何解决它

时间:2016-02-29 18:04:11

标签: c# .net winforms

private int numberofallmessages = 0;
        private int countMsg = 0;

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            OpenPop.Pop3.Pop3Client PopClient = new OpenPop.Pop3.Pop3Client();
            PopClient.Connect("mail", 110, false);
            PopClient.Authenticate("r", "n",
                OpenPop.Pop3.AuthenticationMethod.UsernameAndPassword);
            List<string> uids = PopClient.GetMessageUids();
            int messageCount = PopClient.GetMessageCount();
            numberofallmessages = messageCount;
            allMessages = new List<OpenPop.Mime.Message>(messageCount);
            for (int i = messageCount; i > 0; i--)
            {
                if (backgroundWorker1.CancellationPending == true)
                {
                    e.Cancel = true;
                    return;
                }
                string currentUidOnServer = uids[i];
                if (!seenUids.Contains(currentUidOnServer))
                {
                    if (i > 0)
                        allMessages.Add(PopClient.GetMessage(i));
                    SaveFullMessage(PopClient.GetMessage(i), i);
                    w = new StreamWriter(emailsIDSFile, true);
                    w.WriteLine(i + " = " + currentUidOnServer);
                    w.Close();
                    int nProgress = (messageCount - i + 1) * 100 / messageCount;
                    backgroundWorker1.ReportProgress(nProgress, PopClient.GetMessageCount().ToString() + "/" + i);
                }
            }
            PopClient.Disconnect();
        }

问题在于:

string currentUidOnServer = uids[i];

uids包含7047项,也包含&#39; i&#39;现在是7047

我现在看到如果我改变了这条线:

int messageCount = PopClient.GetMessageCount();

要:

int messageCount = 30;

它工作正常。那么为什么当它的GetMessageCount()及它的7047而不是30它不起作用?

指数超出范围。必须是非负数且小于集合的大小。

2 个答案:

答案 0 :(得分:5)

C#索引从零开始(0到N - 1)。因此,如果您有一个7047元素的集合,那么最后一项将是item[7046]。尝试使用item[7047]超出最后一个元素将导致您获得的错误。

查看您的代码,以下有两个问题:

for (int i = messageCount; i > 0; i--)

首先,初始元素将比集合中的最后一个元素高一个(这会导致您报告的错误)。

其次,永远不会到达集合中的最后(第一个)项,因为当最后一个(或第一个)元素为0时,此迭代将在元素1处停止。

将索引设置为30可以防止错误,因为显然集合中的最后一个索引不超过30。

答案 1 :(得分:1)

这是因为集合的可用索引从0变为Collection.Length-1。所以你应该将messageCount设置为

int messageCount = PopClient.GetMessageCount()-1;