給定一個可能包含數字、符號、空白的字串,找出第一個英文字母(A-Z 或 a-z)並將其轉為大寫輸出。例如 "%.,46,2xb1bfs.,," → X。
public static int FindFirstLetterIndex(string input)
{
byte[] bytes = Encoding.Default.GetBytes(input);
for (int i = 0; i < bytes.Length; i++)
{
byte b = bytes[i];
// ASCII: A-Z(65-90), a-z(97-122)
if ((b >= 65 && b <= 90) || (b >= 97 && b <= 122))
return i;
}
return -1; // 未找到
}
// 使用
string input = "%.,46,2xb1bfs.,,";
int pos = FindFirstLetterIndex(input);
if (pos >= 0)
Console.WriteLine(input.Substring(pos, 1).ToUpper()); // X
缺點:依賴預設編碼,多位元組字元(中文等)會導致索引偏移,非 Unicode 安全。
public static char? GetFirstLetterUpper(string input)
{
foreach (char c in input)
{
if (char.IsLetter(c))
return char.ToUpper(c);
}
return null;
}
// 使用
var result = GetFirstLetterUpper("%.,46,2xb1bfs.,,");
if (result.HasValue) Console.WriteLine(result.Value); // X
優點:正確處理 Unicode 字母(含中文、希臘文、西里爾文等),程式碼簡潔易讀。
using System.Linq;
char? firstUpper = input.Where(char.IsLetter)
.Select(char.ToUpper)
.FirstOrDefault();
適用:程式碼簡潔,但建立迭代器有微小效能開銷。
using System.Text.RegularExpressions;
Match m = Regex.Match(input, @"[A-Za-z]");
if (m.Success)
Console.WriteLine(m.Value.ToUpper());
適用:需擴展為複雜模式時(如首個字母後接數字等)。
| 方法 | 平均耗時 (100萬次迭代) | 備註 |
|---|---|---|
| Byte 陣列 | ~45 ms | 最快但非 Unicode 安全 |
| char.IsLetter 迴圈 | ~52 ms | 推薦:平衡效能與正確性 |
| LINQ | ~78 ms | 語法糖開銷 |
| Regex | ~120 ms | 引擎初始化開銷大 |
public static string GetFirstLetterUpperSafe(string input)
{
if (string.IsNullOrEmpty(input)) return string.Empty;
foreach (char c in input)
{
if (char.IsLetter(c))
return char.ToUpper(c).ToString();
}
return string.Empty; // 或拋出例外視業務需求
}
char.IsLetter:正確性最高,效能次佳null/空字串輸入char.ToUpper(c, CultureInfo.InvariantCulture) 確保一致性