我正在学习C#的第一个测试(初学者(。我在分类方面遇到了一个问题,我应该使用循环创建一个新的数组。例如,这个任务的任务是编写一个接收句子(字符串(和字母(字符(的方法。然后,该方法必须确定字母的索引位置出现在句子中,然后将这些位置放在大堆例如,我们有一个短句"你好,世界"和字母'o',则数组应包含4(第一个的索引位置实例(和7(第二实例的索引位置(。
除了.Length、Console.WriteLine.之外,我不允许使用内置方法
你可以在下面看到我的代码。它根本不起作用。我想把它打印出来";4,7,";
static void Main(string[] args)
{
int[] result = IndexesOfChar("Hello world", 'o');
for(int i = 0; i<result.Length; i++)
{
Console.Write(result[i] + ", ");
}
}
static int[] IndexesOfChar(string sentence, char letter)
{
int count = 0;
int[] newArr = new int[count];
for(int i =0; i < sentence.Length; i++)
{
if(sentence[i] == letter)
{
newArr[count] = i;
count++;
}
}
return newArr;
}
问题是您事先不知道数组Length
。因此,您必须计算count
,然后然后创建数组:
static int[] IndexesOfChar(string sentence, char letter)
{
// Required array length computation:
int count = 0;
for (int i = 0; i < sentence.Length; i++)
if (sentence[i] == letter)
count++;
// We know count, we are ready to create the array:
int[] newArr = new int[count];
// Finally, we fill in the array
// let do not re-use count, but declare separate index variable
int index = 0;
for (int i = 0; i < sentence.Length; i++)
if (sentence[i] == letter)
newArr[index++] = i;
return newArr;
}
您的任务不是阵列的好例子,通常我们在不知道大小的情况下放置List<T>
:
using System.Linq;
...
static int[] IndexesOfChar(string sentence, char letter) {
List<int> result = new List<int>();
for (int i = 0; i < sentence.Length; ++i)
if (sentence[i] == letter)
result.Add(i); // <- unlike array we can just Add a new item
// create an array from list with a help of Linq
return result.ToArray();
}
它不起作用,因为在方法IndexesOfChar中,您创建了一个长度为count的数组(此时为零(。一旦声明数组,就不能修改它的长度
如果您不能使用任何内置方法,我建议您将newArr声明为列表。这就是您应该将索引填充到的内容,然后创建一个数组,并使用另一个for循环将列表的值填充到该数组中。
与类型List
不同,不能更改数组的大小,因此不能执行newArr[count] = i;
,因为newArr
的大小为0。相反,如果你只想使用数组,你可以用它的旧值+新整数重新分配newArr
:
static void Main(string[] args)
{
int[] result = IndexesOfChar("Hello world", 'o');
for(int i = 0; i<result.Length; i++)
{
Console.Write(result[i] + ", ");
}
}
static int[] IndexesOfChar(string sentence, char letter)
{
int count = 0;
int[] newArr = new int[count];
for(int i =0; i < sentence.Length; i++)
{
if(sentence[i] == letter)
{
var updateArr = new int[newArr.Length + 1];
for (int j = 0; j < newArr.Length; j++)
{
updateArr[j] = newArr[j];
}
updateArr[newArr.Length] = i;
newArr = updateArr;
count++;
}
}
return newArr;
}