【问题标题】:Create c# object array of undefined length?创建未定义长度的 c# 对象数组?
【发布时间】:2009-06-21 00:40:45
【问题描述】:

我想在 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 循环中做了更多的逻辑。

【问题讨论】:

  • 需要使用数组吗?用 List 做这种事情通常要容易得多 - 并且性能更高(无论如何根据我的经验)。

标签: c# arrays


【解决方案1】:

你想做的是创造:

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

然后:

words.Add(new Word(word));

如果你需要一个数组,最后当循环完成时:

words.ToArray();

【讨论】:

    【解决方案2】:

    如果您使用的是 C# 3.5,则只需执行以下操作。

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

    【讨论】:

    • 如果您的问题没有 LINQ 解决方案,那么您还不够努力 :) 不错。
    • 好东西。注意,使用 StringSplitOptions.RemoveEmptyEntries 作为第二个 Split() 参数将消除 Where() 调用。虽然更长,但是通过字符串数组节省了另一个循环。
    【解决方案3】:

    您不能创建未定义长度的数组。这是您使用通用列表的地方。

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

    【讨论】:

      【解决方案4】:

      一个友好的说明,您可以通过选项来拆分以忽略空条目。假设没有其他逻辑可以删除条目,您可以像这样预初始化您的数组:

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

      【讨论】:

      • 谢谢,我是根据对答案的另一条评论这样做的。谢谢,我还没有发现这个选项。
      【解决方案5】:

      其实你可以先使用 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();
      

      【讨论】:

        【解决方案6】:

        我想知道为什么我们不能只使用一个字符串变量(比如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(',');
        

        我认为这应该可以根据需要运行,但我没有尝试运行它,所以我不确定。如果有人认为我的解决方案是错误的,请纠正我。

        【讨论】:

          【解决方案7】:

          您可以定义一个新列表并转换为数组...

          var words = new List<Word>().ToArray();
          

          【讨论】:

            【解决方案8】:

            我通过使用 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)); 
            

            我听说整个“创建问题/答案只是为了为他人记录它”是可以接受的。另外,我想听听是否有更好的建议。谢谢。

            【讨论】:

            • 其他答案(即 List)通常被认为更好,因为 ToArray() 代码更少,并且它是类型安全的(你不能不小心将非单词放入其中.
            • 使用通用列表的好答案......不知道为什么我没有首先想到这一点。谢谢!另外,考虑到反对票和我的代表,我想把我的第一个猜测作为“答案”并不是一个好主意!哈
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-10-29
            • 1970-01-01
            • 1970-01-01
            • 2014-06-20
            • 1970-01-01
            • 1970-01-01
            • 2020-01-26
            相关资源
            最近更新 更多