如何将数组复制到锯齿状数组中

how to copy an array into a jagged array

当我尝试将数组复制到锯齿状数组时。我的目标是获取一个 char 类型的数组,将 "words" 分成单独的数组(我为此使用了一个已经工作的函数)并希望将它们放入一个数组中。

static char[][] split_string(char[] str)
{
    int length = count_words(str);
    char[][] sentence = new char[length][];
    int start = 0;
    int end = 0;
    int word = 0;
    int i = -1;
    while (i != str.Length)
    {
     i++;
     if (str[i]==' ')
     {
      end = i-1;
      char[] aux_array = substring(str, start, end);
      //issue
      aux_array.CopyTo(sentence[word], 0);
      //alternative (not working either)
      /*
      for(int j=0; j<aux_array.Length;j++)
      {
       sentence[word][j] = aux_array[j];
      }
      */
      while (str[i]==' ')
      {
       i++;
      }
      word++;
      start = i;
     }
    }
    return sentence;
   }

有关信息,
substring 如果形式为:substring(array, int, int) -> array count_word 的形式为:count_word(array) -> int

My goal is to take an array of type char, separate the "words" into separate arrays (I use an already working function for it) and want to put them into an array.

然后将它们放入数组

//...
sentence[word] = substring(str, start, end);

请注意,参差不齐的数组元素默认为 null,而您并未分配它们,因此您可能遇到了空引用异常。如果你真的需要做一个返回数组的副本,那么最简单的方法是使用 Array.Clone 这样的方法

sentence[word] = (char[])substring(str, start, end).Clone();

使用字符串比原始 char 数组更容易,但我认为您决定使用 char 数组是有意的。

简化代码的一种方法是构建 char 数组,而不是预先分配它。 .NET 数组具有固定大小,但 List<T> 允许您增加项目集合。

您还可以将函数更改为迭代器块以进一步简化它。当一个单词完成后,您 yield return 将其发送给来电者。

IEnumerable<char[]> SplitString(char[] str) {
  var word = new List<char>();
  foreach (var ch in str) {
    if (ch == ' ') {
      if (word.Count > 0) {
        yield return word.ToArray();
        word = new List<char>();
      }
    }
    else
      word.Add(ch);
  }
  if (word.Count > 0)
    yield return word.ToArray();
}

这个函数不会 return 一个数组,所以如果你想要一个数组的数组(锯齿状数组),你需要使用 ToArray():

var str = "The quick brown fox jumps over the lazy dog".ToCharArray();
var result = SplitString(str).ToArray();

此代码将正确处理源字符串开头和结尾的多个空格和空格。