2010-06-26 5 views
0

Donc, je veux supprimer les éléments vides dans la liste comme des espaces pour l'instant J'ai ce code. Mais le compilateur me donne une erreurJ'essaie de supprimer des éléments vides dans la liste en C#

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

* Impossible de convertir groupe méthode « ToString » type non délégué « bool ». Aviez-vous l'intention d'invoquer la méthode?

Répondre

8

ToString est une méthode, vous devez donc utiliser ToString(), et les comparaisons d'égalité sont effectuées avec deux signes égaux ==, pas un. Un signe égal est pour l'affectation. Cela dit, pour parcourir votre collection et supprimer des éléments par leur index, vous aurez envie d'aller en sens inverse. Vous remarquerez que lorsque vous supprimez des éléments, votre nombre d'éléments va baisser, donc votre boucle ne se comportera pas comme vous le pensez. Alors, allez pour quelque chose comme ceci:

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

De plus, je dois souligner que cela ne correspond des chaînes qui sont exactement un espace et un seul espace. Pour correspondre à toutes les chaînes d'espaces, utilisez 'String.IsNullOrWhitespace (listbox2.Items [i] .ToString())' – MiffTheFox

+1

@Miff, C'est un bon point à considérer. C'est une méthode .NET 4, donc elle peut ne pas être disponible si vous travaillez dans un environnement de 3.5 ou moins. –

+2

Dans le cas de <.NET4, vous pouvez toujours utiliser 'string.IsNullOrEmpty (foo.Trim())'. Et je suis sûr que c'est ce que l'auteur de la question voulait, pas l'espace unique. –

0

Vous devriez essayer

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

Le code sera toujours une erreur car le signe égal est manquant et ne correspondra pas aux espaces blancs comme requis par la question. Ce que vous avez placé ne trouvera que des chaînes vides (une fois l'erreur corrigée). –

+0

non l'erreur concerne le =. Devrait être ==. – RvdK

2

Essayez

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

Cependant! Puisque vous supprimez des éléments, cela signifie que l'énumérateur ne fonctionnera pas correctement. Si votre liste des éléments de boîte sont

  • "a"
  • ""
  • "b"

Ensuite, votre code:

  • Gardez un. (Index 0)
  • Supprimer "". (Index 1, "b" devient le nouvel index 1)
  • Lancez un IndexOutOfRangeException. (Parce qu'il n'y a pas l'article 2)

Au lieu de cela, essayez

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

Ou, changez le cycle 'for' d'origine pour diminuer:' for (int i = listBox2.Items.Count - 1; i> = 0; i -) '. Ça va aller, pas besoin de créer une liste et d'exécuter deux cycles. –

+0

String.IsNullOrWhitespace est uniquement disponible par défaut dans .NET 4.0. –

0

On dirait que vous êtes un VB-type. Dans les langages basés sur C (comme C#), il y a (contrairement à VB) deux opérateurs différents pour assigner des choses et vérifier des choses (je ne connais pas les termes réels). Pour vérifier si deux choses sont égales, vous utilisez un double = (==). Donc, ce que vous faites dans votre instruction if, est d'assigner "" à l'élément listbox. Cela ne renvoie évidemment pas un booléen (ce qui est ce qui est nécessaire). Dans les langues pré-C#, cela pourrait causer des bogues très difficiles à trouver, car il n'y avait pas d'avertissement.

Dans VB, vous pouvez appeler une méthode sans utiliser de parenthèses. En C#, ils sont toujours nécessaires. Le compilateur pensera que vous voulez stocker l'adresse de la méthode dans un délégué si vous les omettez (comme utiliser AddressOf dans VB.Net). Quand vous faites ces deux changements (et, en effet, en boucle en arrière comme Anthony Pegram a dit), tout ira bien.

0

Supprimer tout élément vide (ligne) uniquement dans votre zone de liste. Utilisation de VS 2003 framework 1.1 ou VS 2005 framework 2.0 ou VS 2008 framework 3.5, ce code fonctionne pour vous:

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; 
} 

Rappelez-vous si vous cliquez sur la barre d'espace ou onglet dans la nouvelle ligne vide vous créez caractère appel des espaces omble chevalier et cette ligne non vide de comprendre ce que je veux dire, si l'on ajoute les lignes suivantes la zone de liste

  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 

la seule ligne accomplissons la condition String.Empty sans appliquer Trim() à la ligne est la 2ème ligne, mais lorsque nous utilisons Trim() la 4e ligne et de la ligne 7, ils seront comme 2ème ligne ligne blanche sans caractère d'espace blanc afin 2ème (ligne vide ou ligne vide pas besoin de modifier), 4ème, 7 th (devenu ligne vide maintenant après l'utilisation de la garniture) ils seront supprimés de la liste.

Le résultat sera:

IN 
    THE 
    NAME 
    OF 
ALLAH 
Questions connexes