2009-06-21 8 views
9

Je voudrais créer un tableau d'objets en C# de longueur indéfinie, puis remplir le tableau dans une boucle comme si ...Créer un tableau d'objet C# de longueur indéfinie?

string[] splitWords = message.Split(new Char[] { ' ' }); 

    Word[] words = new Word[]; 
    int wordcount = 0; 
    foreach (string word in splitWords) 
    { 
     if (word == "") continue; 
     words[wordcount] = new Word(word); 
     wordcount++; 
    } 

Cependant, je reçois l'erreur ... « création Array doit avoir taille de tableau ou initialiseur de tableau "

Je fais beaucoup plus de logique dans la boucle foreach que j'ai omis par souci de concision.

+1

Besoin d'un tableau? Faire ce genre de chose avec une liste est souvent beaucoup plus facile - et peut être plus performant (dans mon expérience de toute façon). – Bevan

Répondre

40

Ce que vous voulez faire est de créer:

List<Word> words = new List<Word>(); 

puis:

words.Add(new Word(word)); 

Et enfin, quand la boucle se fait si vous avez besoin d'un tableau:

words.ToArray(); 
6

Vous Impossible de créer un tableau de longueur indéfinie. C'est ici que vous utiliseriez une liste générique.

List<Word> words = new List<Word>(); 
9

Si vous utilisez C# 3.5, vous pouvez simplement faire ce qui suit.

var words = message 
    .Split(new char[]{' '}) 
    .Where(x => x != "") 
    .Select(x => new Word(x)) 
    .ToArray(); 
+1

S'il n'y a pas de solution LINQ à votre problème, vous n'essayez pas assez fort :) Un bon. –

+4

Bonnes choses. Une note, en utilisant StringSplitOptions.RemoveEmptyEntries comme second paramètre Split() élimine l'appel Where(). Bien qu'il soit plus long, il enregistre une autre boucle dans le tableau de chaînes. – statenjason

-2

Je l'ai résolu en utilisant un ArrayList puis coulée au tableau d'objets après itérer ...

string[] splitWords = message.Split(new Char[] {' '}); 
    ArrayList wordList = new ArrayList(); 
    int wordcount = 0; 
    foreach (string word in splitWords) 
{ 
     if (word == "") continue; 
     Word newWord = new Word(word); 
     wordList.Add(newWord); 
     wordcount++; 
} 
    Word[] words = (Word[])wordList.ToArray(typeof(Word)); 

J'ai entendu toute « créer de questions/réponses juste pour documenter pour d'autres "est acceptable. De plus, j'aimerais savoir s'il y a de meilleures suggestions. Merci.

+3

Les autres réponses (c'est-à-dire Liste ) sont généralement considérées comme meilleures, étant donné que ToArray() contient moins de code, et qu'il est de type sécurité (vous ne pouvez pas mettre accidentellement des non-mots). –

+0

Bonne réponse en utilisant une liste générique ... je ne sais pas pourquoi je n'ai pas pensé à ça en premier. Merci! Aussi, je devine que ma première estimation en tant que «réponse» n'était pas une bonne idée considérant les votes bas et ding à mon représentant! ha – Lyndal

0

En fait, vous pouvez utiliser la liste pour remplir vos mots d'abord, puis le convertir facilement à un tableau comme celui-ci:

string[] splitWords = message.Split(new Char[] { ' ' }); 

List<Word> words = new List<Word>(); 
int wordcount = 0; 
foreach (string word in splitWords) 
{ 
    if (word == "") continue; 
    words.add(new Word(word)); 
    //wordcount++; 
} 

wordcount = words.count; 
return words.ToArray(); 
1

Une note conviviale, vous pouvez passer l'option de diviser pour ignorer les entrées vides. En supposant qu'aucun autre logique pour émonder les entrées que vous pouvez preinitialize votre tableau comme ceci:

string[] splitWords = message.Split(new Char[] {' '}, 
    StringSplitOptions.RemoveEmptyEntries); 
Word[] words = new Word[splitWords.Length]; 
+0

Merci, je l'ai fait en fonction d'un autre commentaire à une réponse. Merci, je n'avais pas encore découvert cette option. – Lyndal

0

Je me demande pourquoi nous ne pouvons simplement utiliser une variable de chaîne (par exemple x), initialiser et récupérer des données séparées par des virgules dans et ensuite utiliser string[] variable (par exemple y[]) et l'initialiser égale à x.Split(',') sans avoir à initialiser un tableau blanc comme suit:

string x = string.Empty; 
string msg = "hi,how,r,u,xyz"; 

void Page_Load(object sender, EventArgs e) 
    x = msg; 
    string[] y = msg.Split(','); 

Je pense que cela devrait fonctionner au besoin, mais je ne l'ai pas essayé d'exécuter ce donc je suis pas sûr. Si quelqu'un pense que ma solution est incorrecte, corrigez-moi s'il vous plaît.

Questions connexes