2009-06-21 22 views
9

me gustaría crear un array de objetos en C# de longitud definida y luego rellenar la matriz en un bucle así ...Crear matriz de objetos C# de longitud indefinida?

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

Sin embargo, me sale el error ... "creación de la matriz debe tener tamaño de matriz o inicializador de matriz "

Estoy haciendo mucha más lógica en el ciclo foreach que he omitido por brevedad.

+1

¿Necesita usar una matriz? Hacer este tipo de cosas con una lista es a menudo mucho más fácil, y puede ser más eficiente (en mi experiencia de todos modos). – Bevan

Respuesta

40

Lo que se quiere hacer es crear:

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

y luego:

words.Add(new Word(word)); 

Y, finalmente, cuando se realiza el bucle si necesita una matriz:

words.ToArray(); 
6

Usted no puede crear una matriz de longitud indefinida. Aquí es donde usarías una lista genérica.

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

Si está utilizando C# 3.5, puede hacer lo siguiente.

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

Si no hay una solución LINQ para su problema, no lo está intentando lo suficiente :) Agradable. –

+4

cosas buenas. Una nota, usando StringSplitOptions.RemoveEmptyEntries como su segundo parámetro Split() eliminaría la llamada Where(). Aunque es más largo, guarda otro ciclo a través de la matriz de cadenas. – statenjason

-2

Lo resuelto mediante el uso de un ArrayList y luego echándola a la matriz objeto después de la iteración ...

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

he oído toda la "creación de pregunta/respuesta Solo documentarla para otros "es aceptable. Además, me gustaría saber si hay mejores sugerencias. Gracias.

+3

Las otras respuestas (es decir, List ) se consideran generalmente mejores, ya que ToArray() es menos código y es seguro para tipos (no se puede poner accidentalmente palabras que no contengan palabras). –

+0

Excelente respuesta al uso de una lista genérica ... no estoy seguro de por qué no pensé en eso primero. ¡Gracias! Además, supongo que poner mi primera suposición como una "respuesta" no era una buena idea, teniendo en cuenta los votos a la baja y la respuesta a mi representante. ha – Lyndal

0

En realidad se puede utilizar para rellenar la lista de sus palabras y luego convertirlo fácilmente a la matriz de esta manera:

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

Una nota amistosa, que puede pasar opción para dividir a ignorar entradas vacías. Suponiendo que no hay otra lógica para podar las entradas que puede preinitialize la matriz de este modo:

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

Gracias, lo hice basándome en otro comentario a una respuesta. Gracias, todavía no había descubierto esta opción. – Lyndal

0

me pregunto por qué no podemos simplemente usar una variable de cadena (por ejemplo x), inicializar y recuperar los datos separados por comas en y después utilizar string[] variable (por ejemplo y[]) y inicializarlo igual a x.Split(',') sin tener que inicializar una matriz en blanco como sigue:

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

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

creo que esto debería funcionar según sea necesario pero no intente ejecutar esto, así que no estoy seguro. Si alguien piensa que mi solución es incorrecta, por favor corrígeme.

Cuestiones relacionadas