挑出以大写字母开头的每个单词

时间:2014-10-04 23:21:31

标签: c# arrays string foreach

我想挑出以大写字母开头的字符串中的每个单词,但第3行出现数组越界错误;

foreach (string strWord in words)
{
     if (Char.IsUpper(strWord[0]) && strWord.Length > 0)
     {
         Console.Write(strWord + " :: ");
     }
}

感谢您的帮助

5 个答案:

答案 0 :(得分:4)

交换参数,否则在检查之前它会崩溃

if (strWord.Length > 0 && Char.IsUpper(strWord[0]))

答案 1 :(得分:2)

首先执行strWord.Length > 0

if (strWord.Length > 0 && Char.IsUpper(strWord[0]))
{
     Console.Write(strWord + " :: ");
}

因此,在尝试获取首字母之前,您可以确保strWord至少有一个字母。

答案 2 :(得分:1)

这里发生的是你首先检查strWord [0]的值而不首先确定单词中是否有任何字母,所以如果strWord的值为NULL,程序会抛出异常虽然索引0没有给定值,但是为了纠正这个问题,你应该首先检查单词的长度,然后检查字符strWord [0]是否为大写,如果字符串是如果条件在到达第二部分更正的代码1之前将被丢弃,则为NULL: -

if (strWord.Length > 0)
{
    if(Char.IsUpper(strWord[0]))
    {
        Console.Write(strWord + " :: ");
    }
}

更正后的代码2: -

if (strWord.Length > 0 && Char.IsUpper(strWord[0]))
{
    Console.Write(strWord + " :: ");
}

答案 3 :(得分:1)

使用&&amp ;;时,请确保首先检查长度。运算符,因为参数是按顺序计算的。如果第一个参数失败,第二个参数将不会执行,并且当Length为0时,IsUpper会导致越界错误:

http://msdn.microsoft.com/en-us/library/2a723cdk.aspx

所以你只需要交换评估结果:

if (strWord.Length > 0 && Char.IsUpper(strWord[0]))
{
    //etc
}

答案 4 :(得分:1)

&& - 运算符是一个短路运算符,只有在返回已经false时才会计算第一个条件。因此,如果您想要防止异常,这是正确的选择。但是你必须使用正确的顺序,首先检查可能失败的方法。

所以这样:

if (strWord.Length > 0 && Char.IsUpper(strWord[0]))
...

但是,您也可以使用这个简洁的LINQ查询:

var allWordsThatStartWithUpperCaseLetters = words
    .Where(w => w.Length > 0 && Char.IsUpper(w[0]));
string result = string.Join(" :: ", allWordsThatStartWithUpperCaseLetters);