Schnellster Weg, um das Alphabet aufzuzählen


74

Ich möchte das Alphabet folgendermaßen durchlaufen:

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

Ist eine Reihe von Zeichen der beste Weg, dies zu tun? (fühlt sich hacky an)

Bearbeiten: Die Metrik ist "am wenigsten zu implementieren, während sie noch lesbar und robust ist".


Jedes Mal, wenn Sie eine "beste" Frage stellen, müssen Sie Metriken angeben, anhand derer sie bewertet werden können. Andernfalls wird jeder bestimmte Antworten herausgeben, die wahrscheinlich nicht auf Ihre spezielle Situation zutreffen.
Nick Larsen

Das einzige, was, wie Sie sagen, hackig sein kann, ist, dass Sie eine foreach-Schleife anstelle einer standardmäßigen for-Schleife verwenden, aber selbst dann ist es nicht wirklich hackig.
Woot4Moo

Ich suchte nach einem "ordentlicheren" Weg, als über eine Reihe von Zeichen aufzuzählen. Die Metrik ist "am wenigsten zu implementieren, während sie noch lesbar und robust ist" - Richards Antwort kommt meinem ursprünglichen Denken am nächsten (das ich zum Zeitpunkt der Befragung nicht artikulieren konnte)
Ben Aston

Antworten:


161

(Nimmt ASCII usw. an)

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

Alternativ können Sie es auf einen Anbieter aufteilen und einen Iterator verwenden (wenn Sie die Internationalisierung unterstützen möchten):

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 
} 

5
Woah ... daran habe ich nie gedacht. Brillant!
Bobby

14
Wenn Sie foreach benötigen:Enumerable.Range('a', 'z'-'a' + 1).Select(x=>(char)x)
Rob Fonseca-Ensor

8
Es ist nur ein Beispielcode, ich kann nicht die gesamte Anwendung in meine Antwort schreiben. Zu Ihrer Information: Mit einer statischen Methode ist Ihre Lösung an die AlphabetProvider-Klasse gekoppelt.
Richard Szalay

2
@ Rob - Argh! Ich habe vergessen, dass normale Casts zwischen generischen Parametern nicht funktionieren. Wenn Sie eine eigene Version von schreiben Cast, wird der Compiler diese nur akzeptieren, wenn Sie sie objectzuerst verwenden. Das macht es zu einer Box-Konvertierung, sodass Sie nur genau das herausholen können, was Sie eingegeben haben. Also ziehe ich meinen Kommentar zurück.
Daniel Earwicker

3
Es ist wirklich großartig, wenn Sie die Definition der Benutzeroberfläche public interface IAlphabetProvider { IList<string> GetAlphabet(); }aus Gründen der Übersichtlichkeit auch in Ihren Beitrag einfügen können, da es sich um eine benutzerdefinierte Benutzeroberfläche handelt. Auf den ersten Blick sieht es so aus, als ob IAlphabetProvideres sich um eine bereits vorhandene Schnittstelle in der .Net Framework-Klassenbibliothek handelt, und Sie haben sie einfach implementiert, um das Problem von OP zu lösen.
RBT

38

Oder du könntest tun,

string alphabet = "abcdefghijklmnopqrstuvwxyz";

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

2
Mit dieser Lösung ist die Internationalisierung einfach: Verwenden Sie verschiedene Buchstaben :) (vorausgesetzt, C # foreach char wird eher nach Buchstaben als nach 8-Bit-Sequenzen geschrieben). Wenn nicht, kenne ich nicht den besten Ansatz für Multi-Byte-Zeichen in C #.
Joey Adams

@JoeyAdams Würden Sie für die Internationalisierung das fest codierte Literal aus dem Code herausnehmen und über den ResourceManager oder so etwas abrufen?
Jeff B

1
@JoeyAdams String.GetEnumerator()geht charvon char, so dass Sie nur einen Teil Unicode - Codepunkt / Ersatzpaar , wenn die Zeichenfolge solche Zeichen enthält haben würde. Vielleicht möchten Sie sowohl Ihr Alphabet als auch die Daten, die Sie damit vergleichen, normalisieren und sicherstellen, dass Sie in numerischen Codepunkten denken und nicht in char: stackoverflow.com/a/28155130/429091
binki

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

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

2
Es macht nicht viel Sinn, ein anonymes Objekt neu zu aktualisieren, um eine einzelne Eigenschaft zu speichern. Und die integrierte foreachAnweisung ist normalerweise klarer, wenn Sie eine Aktion für jedes Element einer Sequenz ausführen - dafür ist sie gedacht.
Daniel Earwicker

Zur Vereinfachung: Enumerable.Range (65, 26) .ToList (). ForEach (c => Console.WriteLine ((char) c));
Eraph

2

Sie könnten dies tun:

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

Aber auch nicht der beste Weg. Vielleicht könnten wir besser helfen, wenn wir den Grund dafür kennen würden.


7
Braucht mehr char!
Meagar


0

Ich habe das gefunden:

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

beim zufälligen Lesen dieses Blogs und dachte, es sei ein interessanter Weg, um die Aufgabe zu erfüllen.


6
Ich hoffe das war ein Witz. Wirklich :)
mw_21
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.