Создать массив объектов c# неопределенной длины?

Я хочу создать массив объектов в C# неопределенной длины, а затем заполнить массив в цикле вот так...

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

тем не менее, я получаю ошибку... "Создание массива должно иметь размер массива или инициализатор массива"

Я делаю намного больше логики в цикле foreach, который я оставил для краткости.

7 ответов


что вы хотите сделать, это создать:

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

и затем:

words.Add(new Word(word));

и, наконец, когда цикл выполняется, если вам нужен массив:

words.ToArray();

Если вы используете C# 3.5, вы можете просто сделать следующее.

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

вы не можете создать массив неопределенной длины. Здесь вы бы использовали общий список.

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

дружественное Примечание, Вы можете передать опцию разделить, чтобы Игнорировать пустые записи. Предполагая, что никакая другая логика не обрезает записи, вы можете предварительно инициализировать свой массив следующим образом:

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

на самом деле вы можете использовать list для заполнения ваших слов, а затем легко преобразовать его в массив:

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

мне интересно, почему мы не можем просто использовать строковую переменную (скажем x), инициализировать его и получить разделенные запятыми данные в нем, а затем использовать string[] переменной (скажем y[]) и инициализировать его равным x.Split(',') без необходимости инициализировать пустой массив следующим образом:

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

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

Я думаю, что это должно работать по мере необходимости, но я не пытался запустить это, поэтому я не уверен. Если кто-то думает, что мое решение неверно, пожалуйста, поправьте меня.


Я решил его, используя ArrayList, а затем бросил его в массив объектов после итерации...

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

Я слышал, что все" создать Вопрос/ответ, чтобы документировать его для других " приемлемо. Кроме того, я хотел бы услышать, Есть ли лучшие предложения. Спасибо.