2016-02-16 41 views
-1

我想用整個ISO 8859-1 charset生成一個IEnumerable<char>。根據這樣的定義:to this definition如何生成特定字符集的char arrray?

我想:

 testCollection = Enumerable.Range(0x20, 0xFF) 
        .Select(i => Convert.ToChar(i)) 
        .Where(c => (c <= 0x7E && c >= 0xA1)); 

的問題是,爲TestCollection總是空的。我究竟做錯了什麼?

+1

'.Range(爲0x20,0xFF的)'????我認爲它應該在0xff結束,而不是0x120。 (你也喜歡使用相應的'Encoding'或只是byte-to-char來執行正確的轉換就足夠了你的目的嗎?) –

+0

字節到字符就足夠了 –

+0

@AlexeiLevenkov我明白了。我誤讀範圍參數 –

回答

2

c <= 0x7E && c >= 0xA1永遠不會是真的。

嘗試c <= 0xA1 && c >= 0x7E

其實,我會把它寫成:

0x7E <= c && c <= 0xA1

,因爲這使這兩個範圍值之間正在測試的值,我覺得可以更容易地看到它的正確。

雖然你的代碼有點奇怪,它使用20h到ffh的初始範圍,但是僅使用從7eh到a1h的小節。爲什麼不把它當作初始範圍使用並丟失Where()

而且你可能只是做這樣的:

char start = '\x7e'; 
char end = '\xa1'; 
var testCollection = new char[end-start+1]; 

for (char curr = start; curr <= end; ++curr) 
    testCollection[curr - start] = curr; 
+0

其實我認爲OP試圖切出控制C1範圍(0x80-0x9f) - 夫婦Take/Skip或'Where(c =>!(0x80 <= c && c <= 0x9f))'可能產生更好看的代碼(請參閱https://en.wikipedia.org/wiki/Latin-1_Supplement_%28Unicode_block%29瞭解Unicode中的範圍) –