問題代碼
string s = "abc123";
List<char> number = new List<char>();
List<char> alphabet = new List<char>();
for (int i = 0; i < s.Length; i++)
{
if (s[i] is int) // 永遠為 false
number.Add(s[i]);
else
alphabet.Add(s[i]);
}
核心誤區
string 中每個元素類型是 char(Unicode 字符),永遠不是 int。
s[i] is int 編譯通過但運行時恆為 false,導致數字字符全進 alphabet。
正確判斷方法
1. char.IsDigit / char.IsLetter(推薦)
foreach (char c in s)
{
if (char.IsDigit(c))
number.Add(c);
else if (char.IsLetter(c))
alphabet.Add(c);
else
other.Add(c); // 處理空格、標點、換行符等
}
2. 正則表達式分組
var digits = Regex.Matches(s, @"\d").Cast<Match>().Select(m => m.Value[0]).ToList();
var letters = Regex.Matches(s, @"[a-zA-Z]").Cast<Match>().Select(m => m.Value[0]).ToList();
3. LINQ 一行式
var number = s.Where(char.IsDigit).ToList();
var alphabet = s.Where(char.IsLetter).ToList();
補充:常見字符分類方法
| 方法 | 說明 |
char.IsDigit(c) | 0-9 |
char.IsLetter(c) | 字母(含非 ASCII) |
char.IsLetterOrDigit(c) | 字母或數字 |
char.IsWhiteSpace(c) | 空白字符 |
char.IsPunctuation(c) | 標點符號 |
char.IsControl(c) | 控制字符(\r, \n, \t 等) |