2011-12-18 31 views
6

Tengo el siguiente código, estoy tratando de obtener las cadenas que comienzan con capital, ¡pero no sé cómo! sin linq puedo hacerlo pero dentro de LINQ ... ¡ni idea!Cómo comprobar si una cadena comienza con una letra mayúscula en una consulta 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; 
     } 

Respuesta

8

Las soluciones anteriores aquí asumen queryValues2 consiste en cadenas con al menos un caracter en ellas. Si bien eso es cierto para el código de ejemplo, no necesariamente es siempre cierto.

Supongamos, en cambio, tiene la siguiente:

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

(que podría ser el caso si la matriz de cadenas se pasa por una persona que llama, por ejemplo).

Una solución que va directamente a qRes[0] lanzará una IndexOutOfRangeException en el "" y una NullReferenceException en el null.

Por lo tanto, una alternativa más segura para el caso general sería utilizar esto:

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

Gracias por el buen punto !! –

+0

Solo para señalar lo obvio, todas las soluciones anteriores estaban dirigidas al código de ejemplo presentado, y la comprobación de errores se deja al OP (de lo contrario, todas nuestras respuestas tendrían que tener un * "debe hacer xy y z para la comprobación de errores "* descargo de responsabilidad). Su respuesta es correcta, pero está declarando explícitamente que todos los demás dependen implícitamente de la OP para ocuparse de ella. – slugster

+1

@slugster Eso supone que una cadena vacía o nula es una entrada no válida. Si es una entrada válida y la respuesta no la aborda, la respuesta es incompleta. De lo contrario, también podríamos responder con 'where qRes ==" A "', que será verdadero para todas las cadenas en el ejemplo que comienza con una letra mayúscula. – hvd

3

Verificar Char.IsUpper(qRes[0]).

+1

Esa es una '[0]' demasiados, creo que: '' qRes' es un string', por lo que 'QRES [0] 'ya es el' char' que necesitas. Tenga en cuenta que provocará una excepción si se invoca en una cadena vacía, mientras que consideraría que la prueba "comienza con una letra mayúscula" para que sea una prueba válida que debe devolver como falsa. – hvd

+0

hmm llegué 'char'' No se puede aplicar la indexación con [] a una expresión del tipo' cuando intento hacer' QueryResult var = de qResult en queryValues1 de QRES en queryValues2 donde qResult.Length> 3 donde qResult. Longitud <5 donde Char.IsUpper (qRes [0] [0]) seleccione nuevo {qResult, qRes}; ' –

+0

@hvd: Tiene razón; Pensé que su 'qRes [0]' era una cadena. – SLaks

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

Es lo mismo que fuera LINQ.

+0

'qRes [0]' es un carácter único (no un IEnumerable), por lo que esta línea de código no es sintácticamente correcta. – slugster

+0

extraño Realmente lo cambié porque vi otra respuesta use qRes [0] [0] para el personaje. Cambiando de nuevo – Stilgar

6

Prueba esto:

where char.IsUpper(qRes[0]) 
0

intentar algo como esto (en este código arr es una cadena []):

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

Lo esencial es comprobar si el valor ASCII del primer carácter está en el rango de mayúsculas o no.

Cuestiones relacionadas