HOWTO · Csharp

在 C# 中將字串陣列轉換為 Int 陣列

在本指南中,我們將學習如何在 C# 中將字串陣列轉換為 int 陣列。

本頁內容

本指南說明如何在 C# 中將 string 陣列轉換為 int 陣列。由於每個元素都是以文字形式傳入,因此每個值都必須剖析為整數。有三種模式可完成這項工作:Array.ConvertAll、使用 int.Parse 的 LINQ Select 投影,以及以 int.TryParse 為後援、適用於可能無法順利剖析之輸入的相同投影。

使用 Array.ConvertAll 轉換字串陣列

Array.ConvertAll 會將轉換器函式套用到來源陣列的每個元素,並回傳目標型別的新陣列。將 int.Parse 方法群組作為轉換器傳入,即可在單一陳述式中剖析每個字串。

執行此範例:

本節中的程式碼以及顯示的標籤或輸出仍為英文。

using System;

class Program {
  static void Main() {
    string[] temp_str = new string[] { "1000", "2000", "3000" };
    int[] temp_int = Array.ConvertAll(temp_str, int.Parse);

    foreach (int num in temp_int) {
      Console.WriteLine(num);
    }
  }
}
1000
2000
3000

結果是一個新的 int[];原始的 string[] 保持不變。當每個元素都應以相同方式轉換、且不需要進一步投影時,Array.ConvertAll 是很好的預設選擇。由於實際執行轉換的是 int.Parse,因此每個元素都必須是 Int32 範圍內格式正確的整數,接下來各節說明的剖析規則在此同樣適用。

使用 LINQ 的 Select 與 int.Parse 轉換字串陣列

LINQ 的 Select 方法會透過函式將來源序列的每個元素投影。Select(int.Parse) 產生的是 IEnumerable<int> 而非陣列,因此需要 ToArray 才能將結果具體化為 int[]。當轉換是較長 LINQ 管線的一部分(例如在剖析前先篩選值)時,這種形式十分自然合用。

執行此範例:

本節中的程式碼以及顯示的標籤或輸出仍為英文。

using System;
using System.Linq;

class Program {
  static void Main() {
    string[] temp_str = new string[] { "1000", "2000", "3000" };
    int[] temp_int = temp_str.Select(int.Parse).ToArray();

    foreach (int num in temp_int) {
      Console.WriteLine(num);
    }
  }
}
1000
2000
3000

請注意,Select 是延遲執行的:在序列被列舉之前不會剖析任何內容,而 ToArray 只會執行該列舉一次。int.Parse 是嚴格的——當值不是數字時會擲出 FormatException,超出 Int32 範圍時則擲出 OverflowException。上述兩種模式都有這種行為,這正是第三種做法要處理的問題。

使用 int.TryParse 處理無效值

int.TryParse 會回傳 bool 而非擲出例外,因此能容忍無法剖析的值,並將剖析出的數字寫入 out 參數;在 lambda 中,該參數會以 result 呈現。在 Select 內部,lambda 在成功時回傳剖析後的值,失敗時則回傳所選的後援值。下列程式對任何剖析失敗的值都代換為 0:

本節中的程式碼以及顯示的標籤或輸出仍為英文。

using System;
using System.Linq;

class Program {
  static void Main() {
    string[] temp_str = new string[] { "1000", "abc", "3000" };
    int[] temp_int = temp_str.Select(s => int.TryParse(s, out int result) ? result : 0).ToArray();

    foreach (int num in temp_int) {
      Console.WriteLine(num);
    }
  }
}
1000
0
3000

請審慎選擇後援值:代換進去的 0 在結果中與真正的 0 無法區分。如果這種歧義不可接受,請另外記錄失敗情形——將無法剖析的值篩除、使用 -1 之類的哨兵值,或收集有問題的字串以供記錄。

若要快速在這幾種模式之間做選擇:只需要單一呼叫即可完成直接轉換時,使用 Array.ConvertAll;轉換位於 LINQ 管線中時,使用 Select 搭配 int.Parse;輸入不受信任且可接受已明確記錄的後援值時,則使用 int.TryParse。