2010-11-04 9 views

Respuesta

15
var isAllQuestionMarks = input.All(c => c == '?'); 
21

Puede utilizar Enumerable.All:

bool isAllQuestion = input.All(c => c=='?'); 
2

que podría hacerlo en LINQ ...

bool result = input.ToCharArray().All(c => c=='?'); 
3
bool allQuestionMarks = input.All(c => c == '?'); 

Esto utiliza the LINQ All method, que "determina si todos los elementos de una secuencia satisfacen una condición." En este caso, los elementos de la colección son caracteres, y la condición es que el carácter sea igual al carácter de signo de interrogación.

6
 string = "????????"; 
     bool allQuestionMarks = input == new string('?', input.Length); 

acaba de ejecutar una comparación:

esta manera es montones de veces más rápido que la cadena input.All(c => c=='?');

public static void Main() { 
      Stopwatch w = new Stopwatch(); 
      string input = "????????"; 
      w.Start(); 
      bool allQuestionMarks; 
      for (int i = 0; i < 10; ++i) { 
       allQuestionMarks = input == new string('?', input.Length); 
      } 
      w.Stop(); 
      Console.WriteLine("String way {0}", w.ElapsedTicks); 


      w.Reset(); 
      w.Start(); 
      for (int i = 0; i < 10; ++i) { 
       allQuestionMarks = input.All(c => c=='?'); 
      } 
      Console.WriteLine(" Linq way {0}", w.ElapsedTicks); 
      Console.ReadKey(); 
     } 

manera 11 LINQ manera 4189

+1

Eres no probando casos en los que NO son iguales, es una prueba injusta. Solo está revisando el peor de los casos para "Todos" –

+1

Por favor, me complace que lo corrija. Simplemente mejore la prueba y coloque los resultados en –

+0

@Reed, ¿dónde ve la comprobación negativa? "Todo" falla en el primer elemento no coincidente. – greenoldman

4

Tantos ¡respuestas linq! ¿Ya no podemos hacer nada a la antigua usanza? Este es un orden de magnitud más rápido que la solución linq. Más legible? Quizás no, pero para eso están los nombres de los métodos.

static bool IsAllQuestionMarks(String s) { 

     for(int i = 0; i < s.Length; i++) 
      if(s[i] != '?') 
       return false; 

     return true; 
    } 
3

No es muy fácil de leer ... Pero un regular expression es otra manera de hacerlo (y es rápido):

// Looking for a string composed only by one or more "?": 
bool allQuestionMarks = Regex.IsMatch(input, "^\?+$"); 
+0

Definir rápido, porque creo que esto no es más rápido que la solución linq, pero sin la legibilidad. – MarkPflug

+1

Definición: lo suficientemente rápido. No estoy comparando regex con linq, solo estoy mostrando una forma alternativa. No estoy tan seguro de que linq sea más legible, ¿o estás diciendo que linq, un monadic funcional-dsl, es más fácil de entender que una expresión regular ...? :-) Para mí, ambos comparten características similares: fácil de escribir, no tan fácil de entender después de haberlo escrito. – rsenna

0

También puede probar esto:

private bool CheckIfStringContainsOnlyQuestionMark(string value) 
{ 
    return !value.Where(a => a != '?').Select(a => true).FirstOrDefault(); 
} 
Cuestiones relacionadas