2011-12-18 17 views
6

Mam następujący kod, próbuję uzyskać ciągi, które zaczyna się kapitałem, ale nie wiem jak! bez linq Mogę to zrobić, ale w LINQ ... nie mam pojęcia!Jak sprawdzić, czy ciąg rozpoczyna się wielką literą w zapytaniu 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; 
     } 

Odpowiedz

8

Wcześniejsze rozwiązania zakładają, że queryValues2 składa się z ciągów zawierających co najmniej jeden znak. Chociaż odnosi się to do przykładowego kodu, nie zawsze jest to prawda.

Przypuśćmy, że zamiast tego, masz to:

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

(co może mieć miejsce w przypadku, gdy tablica Ciąg jest przekazywana przez rozmówcę, na przykład).

Rozwiązanie, które trafia prosto do qRes[0] zgłosi IndexOutOfRangeException na "" i NullReferenceException na null.

Dlatego bezpieczniejsza alternatywa dla ogólnego przypadku byłoby to wykorzystać:

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

Dzięki za miły punkt !! –

+0

Dla podkreślenia oczywistości, wszystkie wcześniejsze rozwiązania były ukierunkowane na przedstawiony kod przykładowy, a sprawdzanie błędów pozostawiono do PO (w przeciwnym razie wszystkie nasze odpowiedzi musiałyby mieć * "musisz zrobić xy i z, aby sprawdzić błędy" "* disclaimer). Twoja odpowiedź jest prawidłowa, ale wyraźnie określa to, co wszyscy pozostali domyślnie polegają na OP, aby się nimi zająć. – slugster

+1

@slugster Zakłada się, że pusty łańcuch lub pusty łańcuch jest nieprawidłowym wejściem. Jeśli jest to poprawne dane wejściowe, a odpowiedź nie zawiera odpowiedzi, odpowiedź jest niekompletna. W przeciwnym razie możemy równie dobrze odpowiedzieć 'gdzie qRes ==" A "', które będzie prawdziwe dla wszystkich ciągów w przykładzie zaczynającym się od dużej litery. – hvd

3

Sprawdź Char.IsUpper(qRes[0]).

+1

To jeden '[0]' zbyt wiele, myślę: 'qRes' jest to' string', więc 'qRes [0] 'jest już' char', którego potrzebujesz. Zauważ, że spowoduje to zgłoszenie wyjątku, jeśli zostanie wywołany na pustym łańcuchu, podczas gdy ja uważam, że test "zaczyna się od dużej litery", aby być ważnym testem, który powinien zwrócić wartość false. – hvd

+0

hmm mam 'nie mogą ubiegać się o indeksowania [] w celu wyrażenia typu„char'' gdy próbowałem zrobić 'var queryResult = z qResult w queryValues1 z qRes w queryValues2 gdzie qResult.Length> 3 gdzie qResult. Długość <5 gdzie Char.IsUpper (qRes [0] [0]) wybierz nowy {qResult, qRes}; ' –

+0

@hvd: Masz rację; Myślałem, że jego 'qRes [0]' jest ciągiem. – SLaks

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

Jest taki sam, jak poza LINQ.

+0

'qRes [0]' jest pojedynczym znakiem (nie IEnumerable), więc ta linia kodu nie jest poprawna pod względem składniowym. – slugster

+0

Dziwne Właściwie to zmieniłem, ponieważ widziałem inną odpowiedź, użyj qRes [0] [0] dla postaci. Zmiana z powrotem – Stilgar

6

Spróbuj tego:

where char.IsUpper(qRes[0]) 
0

spróbować coś takiego (w tym kodu ARR jest string []):

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

Istotą jest, aby sprawdzić, czy wartość ASCII pierwszego znaku polega na zakres wielkich liter, czy nie.

Powiązane problemy