2010-02-05 23 views
50

Quiero iterar sobre el alfabeto de este modo:Forma más rápida para enumerar el alfabeto

foreach(char c in alphabet) 
{ 
//do something with letter 
} 

es un array de caracteres la mejor manera de hacer esto? (Se siente hacky)

Editar: La métrica es "menos a escribir para poner en práctica mientras que siguen siendo legibles y robusto"

+0

Cada vez que pida un "mejor" pregunta, es necesario dar métricas para evaluar en contra o de lo contrario todo el mundo va a tirar respuestas específicas fuera que probablemente no se aplican a su situación particular. –

+0

Lo único que puede ser chiflado como lo pones es que estás usando un bucle Foreach en lugar de un bucle estándar, pero incluso así no es realmente hacky. – Woot4Moo

+0

Estaba buscando una manera "más ordenada" que enumerando una serie de caracteres. La métrica es "menos tipeada para implementar mientras sigue siendo legible y robusta": la respuesta de Richard es la más cercana a mi pensamiento original (que no pude articular en el momento del interrogatorio) – Ben

Respuesta

120

(Asume ASCII, etc)

for (char c = 'A'; c <= 'Z'; c++) 
{ 
    //do something with letter 
} 

Alternativamente, se puede dividir a cabo a un proveedor y utilizar un iterador (si usted está planeando sobre el apoyo a la internacionalización):

public class EnglishAlphabetProvider : IAlphabetProvider 
{ 
    public IEnumerable<char> GetAlphabet() 
    { 
     for (char c = 'A'; c <= 'Z'; c++) 
     { 
      yield return c; 
     } 
    } 
} 

IAlphabetProvider provider = new EnglishAlphabetProvider(); 

foreach (char c in provider.GetAlphabet()) 
{ 
    //do something with letter 
} 
+3

Woah ... nunca pensé en eso. ¡Brillante! – Bobby

+12

Si necesita un foreach: 'Enumerable.Range ('a', 'z' - 'a' + 1) .Seleccione (x => (char) x)' –

+0

@Richard: Simplemente da la mitad de la solución. Me gusta su enfoque genérico IAlphabetProvider, pero necesita una fábrica para obtener el proveedor correcto. Algo así como: var provider = AlphabetProvider.GetProvider (CultureInfo.CurrentCulture); – Steven

1

usted puede hacer esto:

for(int i = 65; i <= 95; i++) 
{ 
    //use System.Convert.ToChar() f.e. here 
    doSomethingWithTheChar(Convert.ToChar(i)); 
} 

Sin embargo, tampoco es la mejor manera. Tal vez podríamos ayudar mejor si supiéramos el motivo de esto.

+1

De acuerdo, necesito una razón. –

+6

¡Necesita más 'char'! – meagar

2

bien en utilizar el bucle foreach en C#, alfabeto puede ser cualquier IEnumerable<char>. ¿Qué se siente "hacky" al respecto?

31

O usted podría hacer,

string alphabet = "abcdefghijklmnopqrstuvwxyz"; 

foreach(char c in alphabet) 
{ 
//do something with letter 
} 
+2

Con esta solución, la internacionalización es fácil: use letras diferentes :) (suponiendo que el carácter foreach de C# va por letra en lugar de secuencia de 8 bits). Si no es así, no sé cuál es el mejor enfoque para los caracteres multibyte en C#. –

+0

@JoeyAdams Para la internacionalización, ¿sacarías el literal codificado del código y lo obtendrás a través del ResourceManager o algo así? –

+1

@JoeyAdams ['String.GetEnumerator()'] (https://msdn.microsoft.com/en-us/library/system.string.getenumerator%28v=vs.110%29.aspx) dice 'char' por char, por lo que solo tendrías un par de puntos de código Unicode/par suplente si tu cadena contiene dichos caracteres. Por lo tanto, es posible que desee normalizar tanto su alfabeto como los datos que está comparando con el mismo y asegurarse de que piense en términos de puntos de código numéricos en lugar de 'char': https://stackoverflow.com/a/28155130/429091 – binki

0

encontré esto:

foreach(char letter in Enumerable.Range(65, 26).ToList().ConvertAll(delegate(int value) { return (char)value; })) 
{ 
//breakpoint here to confirm 
} 

al leer al azar este blog, y pensé que era una manera interesante para realizar la tarea.

+4

Espero que esto haya sido una broma. Realmente :) –

3
Enumerable.Range(65, 26).Select(a => new { A = (char)(a) }).ToList().ForEach(c => Console.WriteLine(c.A)); 
+2

No tiene mucho sentido revivir un objeto anónimo para almacenar una sola propiedad. Y la declaración 'foreach' incorporada suele ser más clara para realizar una acción en cada elemento de una secuencia: para eso sirve. –

+0

Para simplificar: Enumerable.Range (65, 26) .ToList(). ForEach (c => Console.WriteLine ((char) c)); – Eraph

5
var alphabet = Enumerable.Range(0, 26).Select(i => Convert.ToChar('A' + i)); 
Cuestiones relacionadas