2010-06-26 4 views
0

Так что я хочу удалить пустые элементы в listbox как whitespace, так что у меня есть этот код. Но компилятор дает мне ошибкуЯ пытаюсь удалить пустые элементы в списке в C#

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

* Не удается преобразовать метод группы «ToString» типу без делегата «BOOL». Вы намеревались вызвать метод?

ответ

8

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

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

int count = listBox2.Items.Count; 
for (int i = count - 1; i >= 0; i--) 
{ 
    if (listBox2.Items[i].ToString() == " ") 
    { 
     listBox2.Items.RemoveAt(i); 
    } 
} 
+0

Кроме того, я должен отметить, что это будет соответствовать только строки, которые ровно один пробел, и только одно пространство. Чтобы сопоставить все пробельные строки, используйте 'String.IsNullOrWhitespace (listbox2.Items [i] .ToString())' – MiffTheFox

+1

@Miff. Это хороший момент для рассмотрения. Это метод .NET 4, поэтому он может быть недоступен, если вы работаете в среде с 3.5 или менее. –

+2

В случае <.NET4 вы все равно можете использовать 'string.IsNullOrEmpty (foo.Trim())'. И я вполне уверен, что это то, о чем думал автор вопроса, а не о единственном пространстве. –

0

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

> for (int i = 0; i <= listBox2.Items.Count; i++) 
>    { 
>     if (listBox2.Items[i].ToString() == "") //Remove ' ' space 
>      listBox2.Items.RemoveAt(i); 
>     } 
>    } 
+1

Код по-прежнему будет ошибкой, так как отсутствует знак равенства и не будет соответствовать пробелам, как того требует вопрос. То, что вы положили, будет находить только пустые строки (после устранения ошибки). –

+0

нет ошибки о =. Должно быть. – RvdK

2

Попробуйте

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

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

  • "а"
  • ""
  • "б"

Тогда ваш код:

  • Держите. (Индекс 0)
  • Удалить "". (Индекс 1, «b» становится новым индексом 1)
  • Throw a 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

Или измените исходный цикл 'for', чтобы уменьшить:' for (int i = listBox2.Items.Count - 1; i> = 0; i -) '. Тогда будет хорошо, нет необходимости создавать список и запускать два цикла. –

+0

String.IsNullOrWhitespace доступен только по умолчанию в .NET 4.0. –

0

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

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

0

Удалить все пустое (только) в своем списке. Использование 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; 
} 

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

  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() к линии является второй линии, но когда мы используем Trim() 4-й линии и седьмой линии они будут, как 2-й линии, пустая строка не символ пробела так 2-й (уже пустая строка или пустая строка не нужно изменять), 4, 7 th (теперь после пустой обрезки стала пустой линией), они будут удалены из списка.

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

IN 
    THE 
    NAME 
    OF 
ALLAH