2009-05-20 23 views
12

C# 'daki tüm basılabilir karakterlerden oluşan bir char dizisi alabilmek istiyorum, bunu nasıl yapacağını bilen var mı?C# içindeki tüm yazdırılabilir karakterlerin listesini nasıl alabilirim?

düzenleme: Görünür Avrupa karakterleri anlamına yazdırılabilir By

, yani evet, umlaut, yaklaşık işareti, aksan vs.

+0

yazdırılabilir tanımla – AnthonyWJones

+0

"yazdırılabilir" define Lütfen -.? sadece "yazdırılabilir ASCII karakterleri" demek do (ilvewithin'in answe başına r) yoksa aksanlı karakterler mi dahil etmek istersiniz? –

+0

Baskıdan yola çıkarak kağıda yazdırılabileceğini mi söylüyorsun? Sadece bir ascii aramak için arıyorsanız http://www.asciitable.com birdir. Unicode charmap.exe için açık seçenektir. –

cevap

22

Bu, kontrol karakterleri kabul edilmez tüm karakterleri içeren bir liste verecektir :

List<Char> printableChars = new List<char>(); 
for (int i = char.MinValue; i <= char.MaxValue; i++) 
{ 
    char c = Convert.ToChar(i); 
    if (!char.IsControl(c)) 
    { 
     printableChars.Add(c); 
    } 
} 

Sen uygun şartları bir arada bulmak için diğer Char.IsXxxx yöntemlerini araştırmak isteyebilir. (Fredrik Mörk en dayanarak)

+0

Bir nedenden ötürü, anlamadığım için: (char c = char.MinValue; c <= char.MaxValue; C++) OutOfMemoryException - liste hızlı bir şekilde doldurur –

+0

C++ ifadesi sayaç sarma yapar gibi görünüyor 65535'den sonra 0'a, yani c

+0

(Bazen bu tür rahatsız edici yazım hatalarının kaldırılabilmesi için yorumlar düzenlenebilirdi ...) –

3

A LINQ çözümü:

Enumerable.Range(char.MinValue, char.MaxValue).Select(c => (char)c).Where(
    c => !char.IsControl(c)).ToArray(); 
+0

Bunu derlemeyi/çalıştırmayı denediniz mi? :) –

+0

Whoops, oradaki oyunculara ihtiyacım var. Şerefe. – Noldorin

+0

3.5SP1'den itibaren çalışmayacak. Cevabımı gör. –

18

İşte Fredrik adlı çözümün bir LINQ versiyonu. Enumerable.Range'un bir IEnumerable<int> verdiğini unutmayın, böylece önce chars'a dönüştürmeniz gerekir. Cast<char> inanıyorum 3.5SP0 çalışmış olurdu, ama 3.5SP1 itibariyle bir "doğru" dönüşüm yapmak zorunda: bu kadar bir dizi soru sordu ne gibi bir sonuç oluşturduk

var chars = Enumerable.Range(0, char.MaxValue+1) 
         .Select(i => (char) i) 
         .Where(c => !char.IsControl(c)) 
         .ToArray(); 

- bu Gerçi mutlaka en iyi fikir değil. Kullanım durumuna göre değişir.

Ayrıca, bu, Unicode karakterleri de dikkate almaz, yalnızca basit çok dilli düzlemde olanlar. Yüksek/düşük temsilciler için ne döndüğünü bilmiyorum, ama en azından bir tek char'un her şeyi temsil etmenize izin vermediğini bilmeye değer :(

+0

Gerçekten bu Linq şeylerine dalmaya ihtiyacım var, orada bulmak için bazı zarif çözümler var: o) –

+0

Darn, bu yüzden Jon Skeet'i yeniyorum ve cevabım hala kaybediyor. : (Bir not gibi: Sen bir marjinal olarak daha güzel yapmak için bir Seç ile bir çağrı ile yerini alabilir. – Noldorin

+1

Downvoters, lütfen nedenleri verin. (Bu Noldorin'in cevabına benzer olmasına rağmen, daha fazla bilgi verdiğine inanıyorum - ve işe yarıyor :) –

0

ASCII'nin özellikle talep edilmediğini biliyorum ama bu bir . bütün yazdırılabilir ASCII karakterlerin bir listesini elde etmek için hızlı bir yoldur

for (Int32 i = 0x20; i <= 0x7e; i++) 
{ 
    printableChars.Add(Convert.ToChar(i)); 
} 

bakınız bu ASCII table

0
public bool IsPrintableASCII(char c) 
{ 
    return c >= '\x20' && c <= '\x7e'; 
} 
+1

Bu sorunun, mevcut sorunu düzeltmede OP'ye nasıl yardımcı olduğuyla ilgili bir açıklama ekleyin –

İlgili konular