Я пытаюсь удалить пустые элементы в списке в C # - PullRequest
2 голосов
/ 27 июня 2010

Итак, я хочу удалить пустые элементы в списке, такие как пробелы, пока у меня есть этот код.Но компилятор выдает мне ошибку

for (int i = 0; i < listBox2.Items.Count; i++)
{
    if (listBox2.Items[i].ToString = " "){//ERROR*
        listBox2.Items.RemoveAt(i);
    }
}

* Невозможно преобразовать группу методов ToString в тип без делегата boolВы намеревались вызвать метод?

Ответы [ 5 ]

9 голосов
/ 27 июня 2010

ToString - это метод, поэтому он должен быть ToString(), а сравнение на равенство выполняется с двумя знаками равенства ==, а не с одним Один знак равенства предназначен для назначения.

С учетом сказанного, чтобы перебрать вашу коллекцию и удалить элементы по их индексу, вы захотите пойти в обратном направлении. Вы заметите, что при удалении элементов количество элементов, очевидно, будет уменьшаться, поэтому цикл не будет вести себя так, как вы думаете. Итак, сделайте что-то вроде этого:

int count = listBox2.Items.Count;
for (int i = count - 1; i >= 0; i--)
{
    if (listBox2.Items[i].ToString() == " ")
    {
        listBox2.Items.RemoveAt(i);
    }
} 
3 голосов
/ 21 ноября 2015

Удалить все пустые позиции (строки) только в вашем списке. Используя VS 2003 Framework 1.1 или VS 2005 Framework 2.0 или VS 2008 Framework 3.5, этот код будет работать для вас:

int i = 0;
while (listBox1.Items.Count - 1 >= i)
{
// convert listbox object to string so we can use Trim() for remove all space(whitespace char before and after the word 
//then check if remain character or there is nothing at all whatever whitspace char or any space

  if (Convert.ToString(listBox1.Items[i]).Trim() == string.Empty)
  {
   //if the line became blank after Trim() apply so the line is empty and condition is true
   listBox1.Items.RemoveAt(i);
   //decrement i because we remove line and the following line will take his place and his index number
   i -= 1;
   }
 i += 1;
}

Помните, что если вы нажимаете пробел или вкладку в новой пустой строке, вы создаете символьный пробел, символ пробела и эта не пустая строка.

Чтобы понять, что я имею в виду, добавив следующие строки в список

            listBox1.Items.Add("    IN  ");//click tab before and after IN
            listBox1.Items.Add("");        //blank line no whitespace char or any character
            listBox1.Items.Add("  THE");   //click spacebar twice before THE
            listBox1.Items.Add("    ");    //click tab once
            listBox1.Items.Add(" NAME ");  //click spacebar after and before
            listBox1.Items.Add("    OF "); //click tab before and spacebar after 
            listBox1.Items.Add("        ");//click tab twice
            listBox1.Items.Add("ALLAH");   //no space after or before

Единственная строка соответствует условию String.Empty без применения Trim() к строке - это 2-я строка, но когда мы используем Trim() 4-ую и 7-ю строку, они будут похожи на пустую строку 2-й строки, без пробела 2-й (уже пустая или пустая строка не нуждается в изменении), 4-й, 7-й (теперь стал пустой строкой после использования обрезки) они будут удалены из списка.

Результат будет:

  IN 
  THE
  NAME 
  OF 
  ALLAH
2 голосов
/ 27 июня 2010

Попробуйте

if (String.IsNullOrWhiteSpace(listBox2.Items[i].ToString())){

Тем не менее! Поскольку вы удаляете элементы, это означает, что перечислитель не будет работать должным образом. Если ваши элементы списка

  • "а"
  • ""
  • "б"

Тогда ваш код будет:

  • Держите. (Индекс 0)
  • Удалить "". (Индекс 1, «b» становится новым индексом 1)
  • Бросить IndexOutOfRangeException. (Потому что нет пункта 2)

Вместо этого попробуйте

List<int> itemsToRemove = new List<int>(); // using System.Collections.Generic
for (int i = 0; i <= listBox2.Items.Count; i++)
{
    if (String.IsNullOrWhiteSpace(listBox2.Items[i].ToString())){
        itemsToRemove.Append(i);
    }
}
foreach (int i in itemsToRemove){
    listBox2.Items.RemoveAt(i);
}
0 голосов
/ 27 июня 2010

Похоже, вы парень из VB.В языках на основе C (таких как C #) есть (в отличие от VB) два разных оператора для назначения вещей и проверки вещей (я не знаю реальных терминов).Для проверки, равны ли две вещи, вы используете double = (==).Так что вы делаете в своем операторе if, назначая "" элемент списка.Это, очевидно, не возвращает логическое значение (что, если нужно).В языках pre-c # это может вызвать действительно трудные для поиска ошибки, потому что не было предупреждений.

В VB вы можете вызывать метод без использования скобок.В c # они всегда нужны.Компилятор решит, что вы хотите сохранить адрес метода в делегате, если вы его не указали (как, например, использование AddressOf в VB.Net).Когда вы сделаете эти два изменения (и, действительно, выполните цикл в обратном порядке, как сказал Энтони Пеграм), все будет работать нормально.

0 голосов
/ 27 июня 2010

Вы должны попробовать это

> for (int i = 0; i <= listBox2.Items.Count; i++)
>               {
>                   if (listBox2.Items[i].ToString() == "") //Remove ' ' space
>                       listBox2.Items.RemoveAt(i);
>                   }
>               }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...