2011-12-18 19 views
6

Ho il seguente codice, sto cercando di ottenere le stringhe che iniziano con il capitale, ma non so come! senza linq posso farlo ma dentro LINQ ... nessuna idea!Come verificare se una stringa inizia con una lettera maiuscola in una query 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; 
     } 

risposta

8

Le soluzioni precedenti qui presuppongono tutte queryValues2 costituito da stringhe con almeno un carattere in esse. Mentre questo è vero per il codice di esempio, non è necessariamente sempre vero.

Supponiamo, invece, avete questo:

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

(che potrebbe essere il caso se la matrice di stringhe viene passato da un chiamante, ad esempio).

Una soluzione che va dritto per qRes[0] alzerà un IndexOutOfRangeException sulla "" e NullReferenceException sul null.

Pertanto, un'alternativa più sicura per il caso generale sarebbe quello di utilizzare questo:

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

Grazie per il bel punto !! –

+0

Giusto per evidenziare l'ovvio, tutte le soluzioni precedenti erano mirate al codice di esempio presentato, e il controllo degli errori è lasciato all'OP (altrimenti tutte le nostre risposte dovrebbero avere un * "devi fare xy e z per il controllo degli errori "* disclaimer). La tua risposta è corretta, ma sta esplicitamente affermando ciò che tutti gli altri si affidano implicitamente all'OP di cui occuparsi. – slugster

+1

@slugster Che assume null o una stringa vuota non è valida. Se è un input valido e la risposta non lo risolve, la risposta è incompleta. Altrimenti potremmo rispondere con 'where qRes ==" A "', che sarà vero per tutte le stringhe nell'esempio che iniziano con una lettera maiuscola. – hvd

3

Controllare Char.IsUpper(qRes[0]).

+1

Questa è una '[0]' troppi, penso: 'qRes' è un' STRING', in modo 'QRES [0] 'è già il' char' di cui hai bisogno. Si noti che causerà un'eccezione se viene richiamata su una stringa vuota, mentre considererei il test "inizia con una lettera maiuscola" come test valido che dovrebbe restituire false. – hvd

+0

hmm Ho char'' 'Impossibile applicare l'indicizzazione con [] per un'espressione di tipo' quando ho provato a fare' var = queryResult da qResult in queryValues1 da QRES in queryValues2 dove qResult.Length> 3 dove qResult. Lunghezza <5 dove Char.IsUpper (qRes [0] [0]) seleziona new {qResult, qRes}; ' –

+0

@hvd: hai ragione; Ho pensato che il suo 'qRes [0]' era una stringa. – SLaks

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

È uguale al LINQ esterno.

+0

'qRes [0]' è un singolo carattere (non un oggetto IEnumerable), quindi questa riga di codice non è sintatticamente corretta. – slugster

+0

strano, in realtà l'ho cambiato perché ho visto un'altra risposta usare qRes [0] [0] per il personaggio. Cambiandolo indietro – Stilgar

6

Prova questo:

where char.IsUpper(qRes[0]) 
0

provare qualcosa di simile (in questo codice arr è una stringa []):

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

Il succo è quello di verificare se il valore ASCII del primo carattere risiede nella la gamma di lettere maiuscole o meno.

Problemi correlati