自学 C#。不知道我需要在哪里/修复什么(对象引用未设置为对象的实例。 第 25 行)



我一直在标题中得到错误。我在编码方面不是很有经验,也不擅长阅读和理解代码。

我也知道这将是一个简单的解决方案,但我仍然不知道我需要解决什么或在哪里。

using System;
using System.Linq;
namespace Day_6
{
class Program
{
static void Main(string[] args)
{
int numStrings = Convert.ToInt32(Console.ReadLine());
var str = "";
string[] words = new string[1000];
var even = new string[500];
var odd = new string[500];
for (int i = 0; i < numStrings; i++)
{
str = Console.ReadLine();
words.Append(str);
}
foreach (var word in words)
{
foreach (var letter in word)
{
if (word.IndexOf(letter)%2 != 0)
{
odd.Append(letter.ToString());
}
else
{
even.Append(letter.ToString());
}
}
Console.WriteLine(odd + " " + even);
}
}
}
}

任何帮助,即使只是阅读材料,让我理解为什么/什么/在哪里出现这个错误,都将是非常好的。

毕竟我在努力学习!

非常感谢

如果您必须像现在这样使用数组,请将循环的分配更改为以下

for (int i = 0; i < numStrings; i++)
{
str = Console.ReadLine();
words[i] = str; // Assign to elements of Array (not Append).
}

然后您想要迭代非null的单词(初始数组都是null(。您还需要对每个偶数和奇数数组使用索引。您不能使用indexOf来检查您的字符是偶数还是奇数。。。如果你这样做,那么任何重复的信件都不起作用。也可以使用迭代索引。

int evenIndex = 0;
int oddIndex = 0;
int iterationIndex = 0;
foreach (var word in words.Where(x => x != null))
{
foreach (var letter in word)
{
if (iterationIndex++ % 2 != 0)
{
odd[oddIndex++] = (letter.ToString());
}
else
{
even[evenIndex++] = (letter.ToString());
}
}
}
// Print this "outside" of your for loops
Console.WriteLine(string.Concat(odd.Where(x => x != null)) + " " + string.Concat(even.Where(x => x != null)));

您还需要在末尾更改Console.WriteLine语句,以打印数组的元素,而不是打印字符串数组的类型。

Console.WriteLine(string.Concat(odd.Where(x => x != null)) + " --- " + string.Concat(even.Where(x => x != null)));

测试输入和输出

2
abababababababababababababab
abababababababababababababab
bbbbbbbbbbbbbbbbbbbbbbbbbbbb aaaaaaaaaaaaaaaaaaaaaaaaaaaa

不使用索引器的替代建议

foreach (string word in words.Where(x => x != null))
{
for (int i = 0; i < word.Count(); i++)
{
if (i % 2 == 0)
odd[i] = word[i].ToString();
else
even[i] = word[i].ToString();
}
}

空引用错误的第一个实例是由第17行引起的,其中有words.Append(str);,请将其替换为words[i] = str;

请在此处阅读IEnumerable.Append()方法的行为,因为它不会在适当的位置修改数组words;它返回一个新的IEnumerable,然后必须将其枚举到一个数组中。

所以words.Append(str);这个语句实际上没有任何作用;如果您希望使用Append()方法,您必须保存它的返回值,并将结果枚举到一个数组中,如下所示:

words = words.Append(str).ToArray()

此外,在Main()方法(第9行(中的第3条语句中还有第二个空引用错误,其中有

string[] words = new string[1000];

如果您将其替换为:

string[] words = new string[numStrings];

您将消除foreach循环在null元素上循环的可能性。

最新更新