using System.Collections.Generic; using System.Linq; namespace DramaLing.Api.Utils { /// /// CEFR 等級轉換和比較輔助類別 /// 處理字串格式 (A1, A2, B1, B2, C1, C2) 與數字格式 (0-6) 的轉換 /// public static class CEFRHelper { /// /// CEFR 等級映射表 /// 0 = 未知/完全沒概念 /// 1-6 = A1 到 C2 /// private static readonly Dictionary LevelToNumericMap = new() { ["A0"] = 0, ["A1"] = 1, ["A2"] = 2, ["B1"] = 3, ["B2"] = 4, ["C1"] = 5, ["C2"] = 6 }; /// /// 數字到字串的反向映射 /// private static readonly Dictionary NumericToLevelMap = LevelToNumericMap.ToDictionary(kvp => kvp.Value, kvp => kvp.Key); /// /// 將 CEFR 字串等級轉換為數字 /// /// CEFR 等級字串 (A1, A2, B1, B2, C1, C2) /// 數字等級 (0=未知, 1-6=A1-C2) public static int ToNumeric(string? level) { if (string.IsNullOrWhiteSpace(level)) return 0; var normalizedLevel = level.Trim().ToUpper(); return LevelToNumericMap.TryGetValue(normalizedLevel, out var numeric) ? numeric : 0; } /// /// 將數字等級轉換為 CEFR 字串 /// /// 數字等級 (0-6) /// CEFR 等級字串,無效值返回 "Unknown" public static string ToString(int level) { return NumericToLevelMap.TryGetValue(level, out var cefr) ? cefr : "Unknown"; } /// /// 比較兩個等級:level1 是否高於 level2 /// /// 等級1 (數字) /// 等級2 (數字) /// level1 > level2 public static bool IsHigherThan(int level1, int level2) { return level1 > level2; } /// /// 比較兩個等級:level1 是否低於 level2 /// /// 等級1 (數字) /// 等級2 (數字) /// level1 < level2 public static bool IsLowerThan(int level1, int level2) { return level1 < level2; } /// /// 比較兩個等級是否相同 /// /// 等級1 (數字) /// 等級2 (數字) /// level1 == level2 public static bool IsSameLevel(int level1, int level2) { return level1 == level2; } /// /// 字串版本:比較兩個 CEFR 等級 /// /// 等級1 (字串) /// 等級2 (字串) /// level1 > level2 public static bool IsHigherThan(string? level1, string? level2) { return IsHigherThan(ToNumeric(level1), ToNumeric(level2)); } /// /// 字串版本:比較兩個 CEFR 等級 /// /// 等級1 (字串) /// 等級2 (字串) /// level1 < level2 public static bool IsLowerThan(string? level1, string? level2) { return IsLowerThan(ToNumeric(level1), ToNumeric(level2)); } /// /// 字串版本:比較兩個 CEFR 等級是否相同 /// /// 等級1 (字串) /// 等級2 (字串) /// level1 == level2 public static bool IsSameLevel(string? level1, string? level2) { return IsSameLevel(ToNumeric(level1), ToNumeric(level2)); } /// /// 驗證數字等級是否有效 /// /// 數字等級 /// 是否在 0-6 範圍內 public static bool IsValidNumericLevel(int level) { return level >= 0 && level <= 6; } /// /// 驗證字串等級是否有效 /// /// 字串等級 /// 是否為有效的 CEFR 等級 public static bool IsValidStringLevel(string? level) { if (string.IsNullOrWhiteSpace(level)) return false; var normalizedLevel = level.Trim().ToUpper(); return LevelToNumericMap.ContainsKey(normalizedLevel); } /// /// 取得所有有效的數字等級 /// /// 數字等級陣列 (0-6) public static int[] GetAllNumericLevels() { return new int[] { 0, 1, 2, 3, 4, 5, 6 }; } /// /// 取得所有有效的字串等級 /// /// CEFR 等級字串陣列 public static string[] GetAllStringLevels() { return new string[] { "A1", "A2", "B1", "B2", "C1", "C2" }; } } }