[英]c# System.ArgumentOutOfRangeException
我正在制作發送帶有一些數據的電子郵件的程序。 我知道System.ArgumentOutOfRangeException
異常意味着數組/列表中的數字不存在,但是我不知道我寫錯了什么。
這是一個代碼:
public void SendMail()
{
StreamReader sr = new StreamReader(path1);
var lineCount = File.ReadLines(path1).Count();
List<string> data = new List<string>();
for (int i = 0; i < lineCount; i++)
{
data[i] = sr.ReadLine(); //Error Comes here.
}
string finaldata = data[0] + "/n" + data[1] + "/n" + data[2] + "/n" + data[3] + "/n" + data[4] + "/n" + data[5] + "/n" +
data[6] + "/n" + data[7] + "/n" + data[8] + "/n" + data[9] + "/n" + data[10];
var fromAddress = new MailAddress("tutorialvideohd@gmail.com", "From Name");
var toAddress = new MailAddress("tutorialvideohd@example.com", "To Name");
const string fromPassword = "*****";
string subject = "Some Users Data.";
string body = finaldata;
var smtp = new SmtpClient
{
Host = "smtp.gmail.com",
Port = 587,
EnableSsl = true,
DeliveryMethod = SmtpDeliveryMethod.Network,
UseDefaultCredentials = false,
Credentials = new NetworkCredential(fromAddress.Address, fromPassword)
};
using (var message = new MailMessage(fromAddress, toAddress)
{
Subject = subject,
Body = body
})
{
smtp.Send(message);
}
}
當您這樣做時,它只會創建一個空列表:
List<string> data = new List<string>();
因此,如果您嘗試使用索引分配值,則嘗試將值分配給不存在的對象。
相反,您應該如下所示Add()
:
data.Add(sr.ReadLine());
編輯:
另外,與提出的問題無關,但我看不到您關閉了已打開的StreamReader
,這始終是一個壞習慣。 我建議改為使用using
語句,該語句將為您處理StreamReader
的打開和關閉。 另外,獲取lineCount
是多余的,您可以利用這樣的事實來進行以下操作:不需要預先設置列表中的項目數。
List<string> data = new List<string>();
using (StreamReader sr = new StreamReader(path1))
{
while(!sr.EndOfStream)
data.Add(sr.ReadLine());
}
首先,您有一個空字符串列表,您無法通過訪問索引來填充data
,因為這些索引尚不存在。 您必須使用data.Add(sr.ReadLine())
創建新索引並在其中添加值。
string finaldata = data[0] + "/n" + data[1] + "/n" + data[2] + "/n" + data[3] + "/n" + data[4] + "/n" + data[5] + "/n" +
data[6] + "/n" + data[7] + "/n" + data[8] + "/n" + data[9] + "/n" + data[10];
硬編碼ID意味着您至少需要11項,如果數量少了,它將中斷。 您為什么不這樣做呢?
string finalData = String.Join("/n", data);
這樣,它使用換行符作為分隔符來連接您的字符串列表,並且列表中是否有更多項都無關緊要。
您正在數組列表中設置一個尚未初始化的項目。 在引發異常的位置使用以下行。
data.Add(sr.ReadLine());
您在做同一件事兩次。
此代碼塊:
StreamReader sr = new StreamReader(path1);
// ... you had some code here, but not relevant to the point...
for (int i = 0; i < lineCount; i++)
{
data[i] = sr.ReadLine(); //Error Comes here.
}
用一串字符串填充列表data
。
此代碼塊:
var lineCount = File.ReadLines(path1).ToList();
精確地使用您要填充到data
中的字符串列表填充lineCount
。
因此,只需執行以下操作:
StreamReader sr = new StreamReader(path1);
var lineCount = File.ReadLines(path1).Count();
List<string> data = lineCount;
並擺脫以下代碼塊:
for (int i = 0; i < lineCount; i++)
{
data[i] = sr.ReadLine(); //Error Comes here.
}
並注意現在如何正確填充data
。您確實也不需要該StreamReader
,但是,嘿,我現在不想重寫整個代碼。
關鍵要點:閱讀文檔,嘗試了解每個函數調用的功能,尤其是.NET Framework的功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.