[英]how to copy an array into a jagged array
当我尝试将数组复制到锯齿状的数组中时。 我的目标是采用char类型的数组,将“单词”分隔为单独的数组(我使用了已经起作用的函数)并将其放入数组中。
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(array,int,int)->数组count_word的形式为:count_word(array)-> int
我的目标是采用char类型的数组,将“单词”分隔为单独的数组(我使用了已经起作用的函数)并将其放入数组中。
然后将它们放入数组
//...
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();
}
此函数不会返回数组,因此,如果要数组数组(锯齿状数组),则需要使用ToArray()
:
var str = "The quick brown fox jumps over the lazy dog".ToCharArray();
var result = SplitString(str).ToArray();
此代码将正确处理源字符串开头和结尾的多个空格和空格。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.