2017-10-06 4 views
0

Je travaille sur une fenêtre de l'application abd me semble avoir rencontré un problème où je reçois Index as out of rang of array lorsque vous essayez d'ajouter une ligne de zone de texte à une liste:Impossible d'ajouter la ligne de texte à la liste <string>

mon code actuel est comme suit:

if (NameTB.Lines.Count() > 0) 
       for (int i = 1; 1 <= NameTB.Lines.Count(); i++) 
        nameList.Add(NameTB.Lines[i].Replace(Environment.NewLine, "").Trim()); 

J'ai aussi essayé:

if (NameTB.Lines.Length > 0) 
     for (int i = 1; 1 <= NameTB.Lines.Length; i++) 
      nameList.Add(NameTB.Text[i - 1].ToString().Replace(Environment.NewLine, "").Trim()); 

et

 if (NameTB.Lines.Count() > 0) 
      for (int i = 1; 1 <= NameTB.Lines.Count(); i++) 
       nameList.Add(Convert.ToString(i).Replace(Environment.NewLine, "").Trim()); 

Même si le dernier exemple ne donne pas l'erreur d'index mais reste coincé dans une boucle. Je l'ai fait quelque chose comme ça avant, mais en utilisant WPF et TextBox.GetLineText mais sûr de savoir comment ACHIVE la même chose dans Winforms

+0

Dans 'condition de boucle for'' 1 <= NameTB .Lines.Count' retournera toujours 'true' - donc vous finirez avec la boucle infinie – Fabio

+0

Vous pouvez obtenir toutes les lignes par' var lines = NameTB.Text.Split (Environment.NewLine) .Select (line => line.Trim ()). ToArray(); ' – Fabio

Répondre

3

Utilisez ceci:

if (NameTB.Lines.Count() > 0) 
    for (int i = 0; i < NameTB.Lines.Count(); i++) //or i <= NameTB.Lines.Count() - 1 
     nameList.Add(NameTB.Lines[i].Replace(Environment.NewLine, "").Trim()); 

indexation en C# sont basés sur 0, vous devez donc commencer par 0 (bien sûr si vous ne voulez pas démarrer à partir du second élément).

Bien sûr votre boucle infinie et IndexOutOfRangeException problèmes causés par 1 <= NameTB.Lines.Count(); état, votre i sans cesse croissante, mais NameTB.Lines a quantité limitée d'éléments, vous devez donc utiliser i au lieu de 1.

Mais seulement changer 1-i ne résoudra pas votre problème, parce que les éléments comptent dans tout tableau/collection est toujours plus grand que l'indice du dernier élément, vous devez donc changer

i <= NameTB.Lines.Count(); 

à

i < NameTB.Lines.Count(); //or i <= NameTB.Lines.Count() - 1; 
+0

vous devriez vraiment mentionner que l'erreur vient, parce que la condition de cacel dans OP pour la boucle est une comparaison de ' Comptez avec le nombre «1» et non la variable d'indexation. –

+0

"il peut provoquer une boucle infinie, mais il ne lancera jamais IndexOutOfRangeException" Oui, c'est exactement ce que sera le résultat d'une incrémentation sans fin de 'i'. si la boucle ne s'arrête jamais, 'i' sera à un certain point plus grand que' Count' –

+0

Je suis downvoting, parce que votre réponse n'aborde pas le noyau du problème. Le noyau est la condition d'annulation de la boucle, pas la valeur de départ. Votre message a un code de travail, mais vous n'avez pas pu expliquer pourquoi le problème est survenu en premier lieu –

1
1 <= NameTB.Lines.Count(); 

Isnt qui a toujours vrai, comme vous ne changez le comte des lignes (et vous ne devriez pas Eitherway) ?

Je suppose que vous voulez boucle jusqu'à ce que

i < NameTB.Lines.Count(); 

et que vous voulez commencer à 0, comme le premier indice d'un tableau est 0

+1

Dans ce cas, il obtiendra également' IndexOutOfRangeException', en raison de '<=' (Seule la seconde version fonctionnera) – SeM

2

Notez que les tableaux sont basés sur zéro, et votre deuxième argument semble créer une boucle infinie qui dépasse l'indice de matrice maximal de Lines.La construction correcte en boucle devrait être comme ceci:

if (NameTB.Lines.Count() > 0) 
{ 
    for (int i = 0; i < NameTB.Lines.Count(); i++) 
    { 
     nameList.Add(NameTB.Lines[i].Replace(Environment.NewLine, "").Trim()); 
    } 
} 

Voir aussi:

What is an IndexOutOfRangeException/ArgumentOutOfRangeException and how do I fix it?

0

Essayez ceci:

if (NameTB.Lines.Count() > 0) 
       for (int i = 1; i <= NameTB.Lines.Count() - 1; i++) 
        nameList.Add(NameTB.Lines[i-1].Replace(Environment.NewLine, "").Trim()); 
+1

Vous devriez expliquer votre réponse. Aussi, j'utilise généralement 'i <[..]. Count()' au lieu de 'i <= [..]. Count() - 1' qui me semble plus compliqué. – Rafalon

+0

Ouais, vous pouvez utiliser Count() ou Count() - 1. Je veux juste faire en sorte qu'il soit similaire au code d'origine, de sorte que vous pouvez voir les différents. ;) – Bungysheep