我正在尝试完成几周前应完成的练习任务(未评分),并且我一生无法弄清问题所在。我需要输出 1 2快速 3棕色 4只狐狸 5跳 6岁以上 7个 8懒 9只狗” 我有分割字符串,所以我可以将所有单词都记下来,只是无法获取之前的数字。到目前为止,我有这个
int ctr = 0;
string sentance = "The quick brown fox jumped over the lazy dog. ";
string[] split = sentance.Split(new char[] { ' ', '.' });
foreach (string s in split)
{
if (s.Trim() != "")
Console.WriteLine("{0} {2}", ctr++, s);
}
Console.ReadLine();
我一直得到的只是一个未处理的异常,我找不到原因。
答案 0 :(得分:3)
在线
Console.WriteLine("{0} {2}", ctr++, s);
{0}
指的是后面列表中的第零个元素;就是ctr++
。
{1}
(如果使用的话)将指向下一个s
。
您曾经使用过的{2}
是指下一个(如果有下一个,但是没有);那就是你的问题。
{2}
中没有2号变量(分别为0、1、2)。
尝试
Console.WriteLine("{0} {1}", ctr++, s);
,您应该会看到{1}
捡起s
。
您的错误消息可能类似于“索引(从零开始)必须大于或等于零且小于参数列表的大小”
这意味着您在{2}
中的索引2是有问题的。它符合第一部分(“大于或等于零”),但不符合第二部分(“小于参数列表的大小”),因为您的参数列表只有2个长(ctr++
和{{1 }}),但2(您在{{1}中的索引)不少于2(参数列表的大小)。
您还遇到了s
的问题,但这足以使您重回正轨。
答案 1 :(得分:0)
我将字符串数组的每个元素附加到字符串“结果”,然后在for循环后打印整个内容。
我试图以一种简单的方式进行连接,但是您可以使用其他一些功能来使此界面更漂亮,而无论如何手动操作都希望对您有所帮助。
string sentence = "The quick brown fox jumped over the lazy dog. ";
string[] split = sentence.Split(new char[] { ' ', '.' });
string result = "";
int i = 1;
foreach (string s in split)
{
if (s.Trim() != ""){
result += (i + " " + s + " ");
i++;
}
}
Console.WriteLine(result);
答案 2 :(得分:0)
您的代码似乎正常。您只需要使用"{0} {1}"
而不是"{0} {2}"
,因为您需要索引0和1。另一个有趣的选择是使用Linq
库。为确保输出为“ 1 ... 2 ... 3 ...”而不是“ 0 .... 1 ... 2 ...”,您需要确保不使用++ctr
ctr++
。这样可以确保在增量之后之后而不是在之前返回值。
使用System.Linq
库,您可以简单地使用以下内容:
string sentance = "The quick brown fox jumped over the lazy dog. ";
string[] split = sentance.Split(new char[] { ' ', '.' });
string result = string.Join(" ", from w in split
where w.Trim() != ""
select ++ctr + " " + w);
答案 3 :(得分:0)
您的代码应如下所示:
int ctr = 0;
string sentance = "The quick brown fox jumped over the lazy dog. ";
string[] split = sentance.Split(new char[] { ' ', '.' });
foreach (string s in split)
{
if (!string.IsNullOrWhiteSpace(s))
Console.WriteLine("{0} {1}", ctr++, s);
}
Console.ReadLine();
此处string.IsNullOrWhiteSpace的更多信息。
String.Split也带有重载。其中之一是RemoveEmptyEntries
。如果您需要删除空条目并避免检查Trim()等,则可以使用它。进一步了解here。