2015-10-15 39 views
1

this page,對於C#示例代碼包含下面的代碼,其中cardNumber是一個字符串:char 0減法有什麼作用?

cardNumber.Select(c => c - '0').ToArray()

現在,這似乎做的是從cardNumber每個字符減去0,返回各自的整數,然後將它們放入一個數組中。我的問題,特別是關於c - '0'部分代碼的部分是:

1)爲什麼要這樣做?什麼是潛在的行爲/解釋?

2)爲什麼要這樣做,而不是使用Int32.Parse?

注意:Here is a similar question in C,這個問題可能有相同/相似的解釋。

+4

是,答案是一樣的其他問題。這似乎是某人想要快速在單行代碼中將數字字符串拆分爲單個數字的技巧。 –

+0

這是一個優雅的代碼。 Int32.Parse看起來更復雜。 –

+0

但是,另一個問題並未解釋在C#中使用此方法的好處。 –

回答

5

它減去unicode代碼點。因此,如果c9類似,則操作是'9' - '0'9的代碼點是57048,因此它將執行57 - 48,結果爲9

我能想到通過int.Parse這樣做的唯一原因是速度 - 這是一種算術運算,它比int.Parse的運算速度快得多。

+0

Unicode代碼點,在一般情況下減去'char單曲。對於'0''...''9',它確實等於ASCII。 (即使這不是100%準確的,但它更接近。) – hvd

+0

@ hvd是的,謝謝。 C#內部使用UTF-16,因此更加正確。 –

+0

很好的答案。希望你不介意我在我的回答中鏈接到你的解釋,但我想用這種方法來解釋其中的一個問題,並且你已經全面地介紹了它的部分功能。如果你更喜歡我沒有鏈接到你,讓我知道,我會寫我自己的解釋。 – theB

1

每個字符都有一個數字表示,因此它可以存儲在內存中,並且c - '0'操作只是從代表c所保存字符的數字中減去代表'0'的數字。

因此,如果c包含'5',則操作結果將爲編號5

這裏是快速refrence到ASCII打印代碼表,到Unicode是向後兼容:

Binary  Oct Dec Hex Glyph 

010 0000 040 32 20 (space) 
010 0001 041 33 21 ! 
010 0010 042 34 22 " 
010 0011 043 35 23 # 
010 0100 044 36 24 $ 
010 0101 045 37 25 % 
010 0110 046 38 26 & 
010 0111 047 39 27 ' 
010 1000 050 40 28 (
010 1001 051 41 29 ) 
010 1010 052 42 2A * 
010 1011 053 43 2B + 
010 1100 054 44 2C , 
010 1101 055 45 2D - 
010 1110 056 46 2E . 
010 1111 057 47 2F/
011 0000 060 48 30 0 
011 0001 061 49 31 1 
011 0010 062 50 32 2 
011 0011 063 51 33 3 
011 0100 064 52 34 4 
011 0101 065 53 35 5 
011 0110 066 54 36 6 
011 0111 067 55 37 7 
011 1000 070 56 38 8 
011 1001 071 57 39 9 
011 1010 072 58 3A : 
011 1011 073 59 3B ; 
011 1100 074 60 3C < 
011 1101 075 61 3D = 
011 1110 076 62 3E > 
011 1111 077 63 3F ? 
100 0000 100 64 40 @ 
100 0001 101 65 41 A 
100 0010 102 66 42 B 
100 0011 103 67 43 C 
100 0100 104 68 44 D 
100 0101 105 69 45 E 
100 0110 106 70 46 F 
100 0111 107 71 47 G 
100 1000 110 72 48 H 
100 1001 111 73 49 I 
100 1010 112 74 4A J 
100 1011 113 75 4B K 
100 1100 114 76 4C L 
100 1101 115 77 4D M 
100 1110 116 78 4E N 
100 1111 117 79 4F O 
101 0000 120 80 50 P 
101 0001 121 81 51 Q 
101 0010 122 82 52 R 
101 0011 123 83 53 S 
101 0100 124 84 54 T 
101 0101 125 85 55 U 
101 0110 126 86 56 V 
101 0111 127 87 57 W 
101 1000 130 88 58 X 
101 1001 131 89 59 Y 
101 1010 132 90 5A Z 
101 1011 133 91 5B [ 
101 1100 134 92 5C \ 
101 1101 135 93 5D ] 
101 1110 136 94 5E^
101 1111 137 95 5F _ 
110 0000 140 96 60 ` 
110 0001 141 97 61 a 
110 0010 142 98 62 b 
110 0011 143 99 63 c 
110 0100 144 100 64 d 
110 0101 145 101 65 e 
110 0110 146 102 66 f 
110 0111 147 103 67 g 
110 1000 150 104 68 h 
110 1001 151 105 69 i 
110 1010 152 106 6A j 
110 1011 153 107 6B k 
110 1100 154 108 6C l 
110 1101 155 109 6D m 
110 1110 156 110 6E n 
110 1111 157 111 6F o 
111 0000 160 112 70 p 
111 0001 161 113 71 q 
111 0010 162 114 72 r 
111 0011 163 115 73 s 
111 0100 164 116 74 t 
111 0101 165 117 75 u 
111 0110 166 118 76 v 
111 0111 167 119 77 w 
111 1000 170 120 78 x 
111 1001 171 121 79 y 
111 1010 172 122 7A z 
111 1011 173 123 7B { 
111 1100 174 124 7C | 
111 1101 175 125 7D } 
111 1110 176 126 7E ~ 
+0

沒問題,因爲它是固定的,我已經清理了評論。這個將在12小時內自毀。 – theB

1

戴夫齊赫在他的answer指出的是絕對正確的。這將字符串轉換爲數字數組。

您經常會在嵌入式系統上看到類似的事情,因爲在解析int是一個昂貴的操作。這種方法存在一個重大缺陷。 (除此之外,它不是立即向它做什麼的門外漢明顯。)

考慮採用以下輸入字符串會發生什麼:

اختبار 

結果數組就出來

{ 1527, 1534, 1530, 1528, 1527, 1537 } 

使用此方法時的失敗是無聲的,因爲اختبار123456的字符串一樣有效。使用int.Parse雖然速度可能會更慢,但會拋出FormatException,讓您知道出現問題。

雖然在某些情況下使用c - '0'方法肯定是可以接受的,但只要確保在使用方法時明白風險並確保測試邊緣情況即可。

(任何人誰是有興趣的阿拉伯語是「測試」使用谷歌翻譯的翻譯)

相關問題