2009-06-21 12 views
9

Ich möchte ein Objekt-Array in C# undefinierter Länge erstellen und dann in einer Schleife um das Array zu füllen, wie so ...Erstellen Sie C# -Objekt-Array mit nicht definierter Länge?

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

Allerdings habe ich den Fehler ... „muss Array Schöpfung haben Array-Größe oder Array-Initialisierer "

Ich mache viel mehr Logik in der foreach-Schleife, die ich der Kürze halber weggelassen habe.

+1

Brauchen Sie ein Array? So etwas mit einer Liste zu machen, ist oft viel einfacher - und kann (meiner Erfahrung nach) leistungsfähiger sein. – Bevan

Antwort

40

Was möchten Sie tun, ist zu erstellen:

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

und dann:

words.Add(new Word(word)); 

Und schließlich, wenn die Schleife durchgeführt wird, wenn Sie ein Array benötigen:

words.ToArray(); 
6

Sie kann kein Array mit nicht definierter Länge erstellen. Hier würden Sie eine generische Liste verwenden.

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

Wenn Sie C# 3.5 verwenden, können Sie einfach Folgendes tun.

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

Wenn es keine LINQ-Lösung für Ihr Problem gibt, versuchen Sie nicht hart genug :) Schöne. –

+4

Gute Sachen. Eine Anmerkung, die StringSplitOptions.RemoveEmptyEntries als zweiten Parameter Split() verwendet, würde den Where() -Aufruf ausschalten. Obwohl es länger ist, speichert es eine weitere Schleife durch das String-Array. – statenjason

-2

Ich löste es durch eine Arraylist verwenden und sie dann in das Objektarray nach Iterieren Gießen ...

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

Ich habe die ganze gehört „Frage erstellen/beantworten nur um es zu dokumentieren, für andere "ist akzeptabel. Außerdem würde ich gerne hören, ob es bessere Vorschläge gibt. Vielen Dank.

+3

Die anderen Antworten (z. B. Liste ) werden allgemein als besser angesehen, da ToArray() weniger Code ist und typsicher ist (Sie können nicht versehentlich Nicht-Wörter einfügen). –

+0

Große Antwort auf eine generische Liste ... nicht sicher, warum ich nicht zuerst daran gedacht habe. Vielen Dank! Auch meine erste Schätzung als "Antwort" war nicht so eine gute Idee in Anbetracht der Down-Stimmen und ding zu meinem rep! ha – Lyndal

0

Eigentlich können Sie die Liste benutzen, um Ihre Worte zuerst zu füllen und es dann einfach so zu Array konvertieren:

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

Eine freundliche Anmerkung, können Sie Option passieren aufzuspalten leere Einträge zu ignorieren. keine andere Logik Unter der Annahme, Einträge beschneiden aus Sie Ihre Array wie so preinitialize können:

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

Danke, ich tat dies basierend auf einem anderen Kommentar zu einer Antwort. Danke, ich hatte diese Option noch nicht entdeckt. – Lyndal

0

Ich frage mich, warum können wir nicht nur ein String-Variable (zB x) verwenden, initialisieren und Abrufen von Daten durch Komma getrennt in es und später string[] Variable (zB y[]) verwenden und initialisieren es gleich x.Split(',') ohne ein leeres Array zu initialisieren, die wie folgt:

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

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

ich denke, das sollte je nach Bedarf arbeiten, aber ich habe nicht versucht, diese so läuft I bin nicht sicher. Wenn jemand denkt, dass meine Lösung falsch ist, korrigiere mich bitte.

Verwandte Themen