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

问题描述:

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

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

谢谢您的帮助

+0

_ “数组越界” _?它实际上是一个“索引超出界限例外”吗? – 2014-10-04 23:37:17

交换的参数,否则它崩溃检查:

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

只是做了strWord.Length > 0第一

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

这样你就可以确保strWord公顷在尝试获得第一个字母之前至少要写一封信。

这里发生的事情是,您首先检查strWord [0]的值,而不先确认该单词中是否有字母,因此在strWord的值为NULL的情况下,程序将引发除非索引0被调用,虽然它没有被赋予值,所以要纠正这个问题,你应该首先检查这个字的长度,然后检查字符strWord [0]是否为大写或者不是这种方式,如果字符串为NULL,则如果条件将被丢弃它到达第二部分之前校正代码1: -

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

校正代码2: -

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

确保在使用运算符& &时首先检查长度,因为参数是按顺序评估的。如果第一个参数失败,第二个将不执行,并且IsUpper造成的界外的错误时,长度为0:

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

所以你只需要围绕交换评价:

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

&& - 操作员是一个短路操作员,该操作员只会在返回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);