Alfabede bir dizi harf oluşturmak


92

C # 'da alfabenin harflerini içeren bir dizi oluşturmanın kolay bir yolu var mı? Bunu elle yapmak çok zor değil, ama bunu yapmanın bir yolu olup olmadığını merak ediyordum.


Bilginize, bu soru daha önce uluslararasılaşma göz önünde bulundurularak sorulmuştu .
Serge Wautier

7
Hayır, daha iyi bir yol olup olmadığını merak ettiğim sorulardan sadece biri. :)
Helephant


Yanıtlar:


197

Yerleşik bir yol olduğunu sanmıyorum, ama bence en kolayı

  char[] alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();

7
Dizeyi

1
Kodunuzun farklı dillere sahip makinelerde çalıştığından emin olmak istiyorsanız bu en iyi yoldur. Aksi takdirde, alfabenizi dinamik olarak üretirseniz (aşağıdaki diğer cevaplar gibi) farklı makinelerde farklı bir alfabe ile bitirebilirsiniz.
Luis

Bu farklı dillerde nasıl çalışır? Bu bir şekilde sihirli bir şekilde çince harfleri içerecek mi, yoksa diğer dillerden harfler mi olacak?
Paweł Audionysos

104

C # 3.0:

char[] az = Enumerable.Range('a', 'z' - 'a' + 1).Select(i => (Char)i).ToArray();
foreach (var c in az)
{
    Console.WriteLine(c);
}

evet, Enumerable.Range'in tek aşırı yüklemesi int parametrelerini kabul etse bile çalışır ;-)


'z' - 'a' + 1 = Sadece gerçekten sakar görünüyor, ama ben onun etrafında bir yol göremiyorum :(
CasperT

String.Concat(Enumerable.Range('a', 'z' - 'a' + 1).Select(c => ((char)c).ToString().ToUpperInvariant()));döner ABCDEFGHIJKLMNOPQRSTUVWXYZ;
abatishchev

15
@CasperT: MuhtemelenEnumerable.Range('a', 26)
abatishchev

Bu, ASCII kodları 'a' - 'z' aralığının dışında kalan harflere sahip diller için çalışmayacaktır. Bu gibi durumlarda bu yöntemi kullanamazsınız. Aksi takdirde güzel çözüm.
Michal B.

58
for (char letter = 'A'; letter <= 'Z'; letter++)
{
     Debug.WriteLine(letter);
}

37
char[] alphabet = Enumerable.Range('A', 26).Select(x => (char)x).ToArray();

3
Bunun en iyi çözüm olduğunu düşünüyorum çünkü bu yöntemi bir dizi tamsayı ve küçük harf oluşturmak için de kullanabilirsiniz. Kabul edilen cevap bu olmalı :)
Kapé

@ PopCatalin önce doğru cevabı vermişti, ama benim kullandığım yaklaşım buydu. Neler olup bittiğini takip etmek biraz daha kolay ve bildiğinizi varsaydığı tek bilgi parçası alfabenin 26 karakter ('A' .. 'Z') içerdiğidir ki bunun mantıklı olduğuna inanıyorum.
Mass Dot Net

22

Bunu, 1 tabanlı bir dizine dayalı olarak MS excel sütun kodunu (A, B, C, ..., Z, AA, AB, ..., ZZ, AAA, AAB, ...) almak için yazdım. (Elbette, sıfır tabanlıya geçmek column--;, başlangıçta bırakmaktır .)

public static String getColumnNameFromIndex(int column)
{
    column--;
    String col = Convert.ToString((char)('A' + (column % 26)));
    while (column >= 26)
    {
        column = (column / 26) -1;
        col = Convert.ToString((char)('A' + (column % 26))) + col;
    }
    return col;
}

2
Selam, sadece değiştirilmesi Convert.ToStringile String.valueOf:) o Java çalışmak yapar
Nyerguds

1
GetIndexFromColumnName'e ne dersiniz?
oneiros

14

İngiliz alfabesinin harflerini kastettiğinizi varsayarsak ...

    for ( int i = 0; i < 26; i++ )
    {
        Console.WriteLine( Convert.ToChar( i + 65 ) );
    }
    Console.WriteLine( "Press any key to continue." );
    Console.ReadKey();

9
65'i kodlamak yerine (int) 'A' kullanmak daha iyidir. Bu, kodu daha okunabilir ve hatalara daha az eğilimli hale getirir.
Mehrdad Afshari

Bununla birlikte, 'A'! = 65, (EBCDIC), A'dan Z'ye sıralı olmadığı ana kodlamada.
James Curran

5
Bana bir dizi gibi görünmüyor.
Orbit'te Hafiflik Yarışları

@MehrdadAfshari Dahili olarak kullanılan kodlama konu dışıdır. Ne olduğunu , ilgili tip Char değerleri Unicode kod noktaları olmasıdır ve bu AZ sıralı vardır.
Nyerguds

8

Karakterlerin ascii değerlerine dayanarak şöyle bir şey yapabilirsiniz:

char[26] alphabet;

for(int i = 0; i <26; i++)
{
     alphabet[i] = (char)(i+65); //65 is the offset for capital A in the ascaii table
}

( Buradaki tabloya bakın .) Sadece karakterin int değerinden karakter değerine çeviriyorsunuz - ancak bu yalnızca ascii karakterleri için değil farklı diller için geçerli.

DÜZENLEME: Mehrdad tarafından benzer bir çözüm yorumunda önerildiği gibi , bunu yapmak daha iyidir:

alphabet[i] = (char)(i+(int)('A'));

Bu, A karakterini int değerine atar ve ardından buna göre artar, böylece kodlanmış değildir.


Bu kodda küçük bir hata var. i = 0 ila <27, 27 harf içerir (dizi öğesi 0, ardından öğeler 1 ila 26).
Brian

Daha da iyi hale getirebilirsiniz: alfabe [i] = (karakter) (i + 'A'); Aynı sonuç
CasperT

1
Olması gerekmiyor char[] alphabet = new char[26];mu?
Shishir Gupta

5

Ayrıca, dizenin bir Char döndüren bir [] işlecine sahip olduğunu ve bir karakterin olduğunu unutmayın IEnumerable<char>, bu nedenle çoğu amaç için bir dizeyi char [] olarak kullanabilirsiniz. Dolayısıyla:

string alpha = "ABCDEFGHIJKLMNOPQRSTUVQXYZ";
for (int i =0; i < 26; ++i)
{  
     Console.WriteLine(alpha[i]);
}

foreach(char c in alpha)
{  
     Console.WriteLine(c);
}

3

Kimsenin bir verim çözümü önermediğine şaşırdım:

public static IEnumerable<char> Alphabet()
{
    for (char letter = 'A'; letter <= 'Z'; letter++)
    {
        yield return letter;
    }
}

Misal:

foreach (var c in Alphabet())
{
    Console.Write(c);
}

Güzel, ama bu temelde bir fordöngü yazmanın tuhaf bir yolu .
Nyerguds

@Nyerguds Eğer yield returnparçayı kastediyorsanız , bu gerçekten bir for döngüsüne eşdeğer değildir. Öyle ki sonsuz bir diziyi tembel olarak döndürmek için kullanılabilir.
weston

Hayır, whileher dönüşü artıran ve sabit bir değerde biten bir sayacın olduğu gerçeğini kastediyorum . Tam forolarak değiştirmek için tasarlanan şey budur .
Nyerguds

Ne demek istediğini anlıyorum. Orada bir for döngüsü kullanılabilir. 4 yıl önceydi, neden yapmadığımı açıklamak çok zor!
weston

2
var alphabets = Enumerable.Range('A', 26).Select((num) => ((char)num).ToString()).ToList();

0
char alphaStart = Char.Parse("A");
char alphaEnd = Char.Parse("Z");
for(char i = alphaStart; i <= alphaEnd; i++) {
    string anchorLetter = i.ToString();
}

Görünüşe göre karakterler için doğru alıntıları nasıl kullanacağınızı öğrenmemişsiniz. Bunu dizeden ayrıştırmak için hiçbir neden yok; Sadece kullanmak char alphaStart = 'A';yerine çift tırnak tek tırnak.
Nyerguds

0
//generate a list of alphabet using csharp
//this recurcive function will return you
//a string with position of passed int
//say if pass 0 will return A ,1-B,2-C,.....,26-AA,27-AB,....,701-ZZ,702-AAA,703-AAB,...

static string CharacterIncrement(int colCount)
{
    int TempCount = 0;
    string returnCharCount = string.Empty;

    if (colCount <= 25)
    {
        TempCount = colCount;
        char CharCount = Convert.ToChar((Convert.ToInt32('A') + TempCount));
        returnCharCount += CharCount;
        return returnCharCount;
    }
    else
    {
        var rev = 0;

        while (colCount >= 26)
        {
            colCount = colCount - 26;
            rev++;
        }

        returnCharCount += CharacterIncrement(rev-1);
        returnCharCount += CharacterIncrement(colCount);
        return returnCharCount;
    }
}

//--------this loop call this function---------//
int i = 0;
while (i <>
    {
        string CharCount = string.Empty;
        CharCount = CharacterIncrement(i);

        i++;
    }

biçimlendirme düzeltildi, ancak kod eksik görünüyor ( ifve whileifadelerine bir göz atın )
Oliver

1
Woah, bu kadar basit bir şey için özyineleme? Bunu basit bir süre ile ve 26'ya bölerek yapabilirsiniz.
Nyerguds

0

Console'da İngilizce alfabe edinmenin 4 yolu:

public void ShowEnglishAlphabet()
{
    var firstLetter = 'a';
    var endLetter = 'z';
    for (var letter = firstLetter; letter <= endLetter; letter++)
    {
        Console.WriteLine($"{letter}-{letter.ToString().ToUpper()}");
    }
}

public void ShowEnglishAlphabetFromUnicodeTableDecNumber()
{
    var firstLetter = 97;
    var endLetter = 122;
    for (var letterNumberUnicodeTable = firstLetter; 
    letterNumberUnicodeTable <= endLetter; letterNumberUnicodeTable++)
    {
        Console.WriteLine($"{(char)letterNumberUnicodeTable}- 
        {((char)letterNumberUnicodeTable).ToString().ToUpper()}");
    }
}

public void ShowEnglishAlphabetUnicodeTableEscapeSequence()
{
    var firstLetter = '\u0061';
    var endLetter = '\u007A';
    for (var letterNumberUnicodeTable = firstLetter; 
    letterNumberUnicodeTable <= endLetter; letterNumberUnicodeTable++)
    {
        Console.WriteLine($"{letterNumberUnicodeTable}- 
        {letterNumberUnicodeTable.ToString().ToUpper()}");
    }
}   

public void ShowEnglishAlphabetUnicodeTableLinq()
{
    var alphabets = Enumerable.Range('a', 26).Select(letter => 
    ((char)letter).ToString()).ToList();
    foreach (var letter in alphabets)
    {
        Console.WriteLine($"{letter}-{letter.ToUpper()}");
    }
}

Bu bir çözüm olsa bile, lütfen onun hakkında ve ne işe yaradığı hakkında daha fazla bilgi verin.
George Z.

0

Maalesef kullanıma hazır bir yol yok.

Kullanabilirsiniz; char [] karakterler = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" .ToCharArray ();

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.