2011-12-18 39 views
6

我有以下代码,我试图获取以大写开头的字符串,但我不知道该怎么做!没有LINQ我可以做到这一点,但在LINQ内...不知道!如何检查一个字符串是否以LINQ查询中的大写字母开头

 string[] queryValues1 = new string[10] {"zero", "one", "two", "three", "four", "five", "six", "seven","nine", "ten" }; 
     string[] queryValues2 = new string[3] { "A", "b", "c" }; 

     var queryResult = 
      from qResult in queryValues1 
      from qRes in queryValues2 
      where qResult.Length > 3 
      where qResult.Length < 5 
      where qRes[0].StartWithCapital //how to check if qRes started with a capital letter? 
      select qResult + "\t" + qRes + Environment.NewLine; 

     foreach (var qResult in queryResult) 
     { 
      textBox1.Text += qResult; 
     } 

回答

8

此处早期的解决方案都假设queryValues2由至少包含一个字符的字符串组成。尽管示例代码是这样的,但并不总是如此。

假设,相反,你有这样的:

string[] queryValues2 = new string[5] { "A", "b", "c", "", null }; 

(如果字符串数组传递由主叫方,例如这可能是这种情况)。

是径直的qRes[0]一个解决方案将提高对""IndexOutOfRangeException并在null一个NullReferenceException

因此,一般情况下一个更安全的替代办法是使用这样的:

where !string.IsNullOrEmpty(qRes) && char.IsUpper(qRes[0]) 
+0

感谢您的好点! – 2011-12-18 10:51:25

+0

只是要指出显而易见的是,所有早期的解决方案都是针对所提供的示例代码,并且错误检查留给OP(否则我们所有的答案都必须有*“您必须执行xy和z进行错误检查“*免责声明)。你的回答是正确的,但是明确地说明其他人隐含地依靠OP来照顾。 – slugster 2011-12-18 12:14:30

+1

@slugster假定null或空字符串是无效输入。如果它是有效的输入,并且答案没有解决它,那么答案是不完整的。否则,我们不妨回答一下'where qRes ==“A”',对于示例中以大写字母开头的所有字符串都是如此。 – hvd 2011-12-18 12:19:20

3

检查Char.IsUpper(qRes[0])

+1

这是一个'[0]'太多了,我想:'qRes'是一个'string',所以'qRes [0]'已经是你需要的'char'了。请注意,如果在空字符串上调用该异常,则会引发异常,而我认为测试“以大写字母开头”是一个应该返回false的有效测试。 – hvd 2011-12-18 01:28:06

+0

HMM的我'无法应用用[]索引,以类型的表达式“char''当我试图从QRESULT在queryValues1 从qRes做'变种QueryResult中= 在queryValues2 其中qResult.Length> 3 其中QRESULT。长度<5 其中Char.IsUpper(qRes [0] [0]) 选择新的{qResult,qRes};' – 2011-12-18 01:30:18

+0

@hvd:你是对的;我认为他的'qRes [0]'是一个字符串。 – SLaks 2011-12-18 01:30:55

1
where Char.IsUpper(qRes.FirstOrdefault()) 

它与外部LINQ相同。

+0

'qRes [0]'是一个单独的字符(不是IEnumerable),所以这行代码在语法上不是正确的。 – slugster 2011-12-18 01:37:21

+0

奇怪我实际上改变了它,因为我看到另一个使用qRes [0] [0]的字符。改回它 – Stilgar 2011-12-18 11:37:14

6

试试这个:

where char.IsUpper(qRes[0]) 
0

尝试这样的事情(在此代码ARR是一个字符串[]):

from a in arr 
        where ((int)a.ToCharArray()[0] >= 65 && (int)a.ToCharArray()[0] <= 90) 
        select a 

的要点是要检查的第一个字符的ASCII值是否位于大写字母的范围与否。

相关问题