Проблема с массивом - PullRequest
0 голосов
/ 24 июля 2010

Как проверить наличие нулей в списке массивов и удалить их? Он продолжает выдавать мне ошибку «ArgumentOutOfRange был обработан» или, если я изменяю SMTPException на «Исключение», он говорит «Индекс вне диапазона» Глядя на отладчик и обращая особое внимание на mail.Count, он дает мне Count = 4. Я изначально дал ему 3 электронных письма для проверки. Последний массив - это "". Я считаю, что это вызывает проблему.

private void button1_Click(object sender, EventArgs e)
    {
        try
        {
            if (textBox1.Text == "")
            {
                textBox3.Text += "[-] Listbox is Empty!!!!\r\n";
                return;
            }
            // textBox1.Text.Split(new string[] { "\n" }, StringSplitOptions.RemoveEmptyEntries); 
            // Grabs Emails supplied in textbox1 amd then seperates array using '\n'
            ArrayList mails = new ArrayList(textBox1.Text.Split('\n')); 

            // Note: For thought 
            // IEnumerable<string> myResults = mails.Split('\n').Where<string>(s => !string.IsNullOrEmpty(s));
            for (int i = 0; i < mails.Count; i++)
            {
                // Seperates user & pass to be passed for authentification.
                ArrayList mailInfo = new ArrayList(mails[i].ToString().Split(':'));
                textBox3.Text += "[+] Checking email format for" + "\r\n" + "[/] " +  mails[i] + "\r\n";
                // Attach domain name if not attached.
                if (!mailInfo[0].ToString().EndsWith("@gmail.com")) mailInfo[0] = mailInfo[0] + "@gmail.com"; 

                // Debug:  Check point
                // 
                // Error message:
                // Index was out of range. Must be non-negative and less than the size of the collection. Parameter name index. 
                // mails.Count = 4 when feeding only 3 emails.
                //
                // Function:  Check mail & Password
                // error: index out of range
                // MessageBox.Show(mailInfo[0].ToString() + "\n\n" + mailInfo[1].ToString());
                if (mails[i] == "") throw new ArgumentOutOfRangeException("No Mail", "No more mail to check.");
                if (checkAccount(mailInfo[0].ToString(), mailInfo[1].ToString()))
                {
                    textBox3.Text += "[+] Connection Successful! Checking mail.: mailInfo[0].ToString()\r\n";
                }
            }
        }

Что я делаю не так ??? Является ли ноль моей проблемой, и если да, то как мне ее удалить, или я что-то упустил?

Ответы [ 4 ]

2 голосов
/ 24 июля 2010

Удалить элементы из списка, проверив условия, может быть сложно. Если вы не используете изящный оператор LINQ (так как вы используете ArrayList, я собираюсь предположить, что LINQ вам недоступен), вам нужно будет использовать обратную итерацию.

Если вы перебираете список вроде этого:

foreach(object o in ArrayList)
{

}

Или

for(int i = 0; i < myArray.Count; i++)
{
}

У вас возникнут проблемы с удалением элементов, потому что у вас закончились элементы (поскольку список теперь меньше, чем когда вы определили свой for / foreach).

Вам необходимо использовать обратную итерацию или сохранить список элементов для последующего удаления.

Пример 1: обратная итерация

for(int i = myArray.Count - 1; i >= 0; i--)
{ 
   object o = myArray[i];
   if (<some condition here>)
       myArray.Remove(i);
}

Пример 2: Список удаления *

ArrayList toRemove = new ArrayList();
foreach(object o in myArray)
{
   if(<some condition here>)
     toRemove.Add(o);
}

foreach(object o in toRemove)
   myarray.Remove(o);

Пример 3: Подход LINQ

var cleanEntities = myArray.Where(x => <some condition on x, which is your item>);
0 голосов
/ 24 июля 2010

Обычно проще перебирать один список при создании другого.Трудно пойти не так, как надо.

0 голосов
/ 24 июля 2010

Попробуйте заполнить массив следующим образом:

ArrayList mails = new ArrayList(textBox1.Text.Trim().Split('\n'));

Это должно удалить все пробелы и удалить последний элемент из массива.

0 голосов
/ 24 июля 2010

Я думаю, что пустая запись вызвана возвратом каретки после последнего элемента в вашем текстовом поле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...