# Learn C# Fundamentals by Coding ###### tags: `C#` ## 快速鍵 `control + tab` -> 可以快速變更所在的文件 ## Class 4 Non-Primitive Types (資料型態) ### static 當用了這個修飾詞, 那就不用再new一個instance, 來獲取這個方法, 可以直接用 ```csharp= public class Calc { public static int Add(int a, int b) { return a + b; } } class Program { static void Main(string[] args) { var result = Calc.Add(3, 5); Console.WriteLine(result); Console.ReadLine(); } } ``` ## string 沒啥好介紹的, 大概就兩個方法 ```csharp= static void Main(string[] args) { var firstName = "Mosh"; var LastName = "Wu"; var myFullName = string.Format($"My name is {0}, {1}", firstName, LastName); Console.WriteLine(myFullName); // 記得join要搭配陣列 var names = new string[3] { "Jack", "John", "Mary" }; var namesCombin = string.Join(",", names); Console.WriteLine(namesCombin); } ``` ## enum 現在只知道要用數字, 來列舉 ```csharp= public enum ShippingMethod { RegularAirMail = 1, RegisteredAirMail = 2, Express = 3 } // 得到是列舉的第幾項 var method = ShippingMethod.Express; Console.WriteLine((int)method); //從得到的第幾項堆測是哪一個方法 var methodId = 3; Console.WriteLine((ShippingMethod)methodId); // 因為回傳的是str, 所以加不加上toString其實沒差 Console.WriteLine(method.ToString()); var methodName = "Express"; // 現在還不知道用在哪 var shippingMethod = (ShippingMethod)Enum.Parse(typeof(ShippingMethod), methodName); Console.WriteLine(shippingMethod); Console.ReadLine(); ``` ### 實務上 可以在命名空間, 使用`enum`, 並且在程式碼進入點裡面調用 ```csharp= public enum Image { LandScape, Portrait } static void Main(string[] args) { Console.WriteLine("Enter width"); var width = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Enter height"); var height = Convert.ToInt32(Console.ReadLine()); var orentation = (height > width) ? Image.LandScape : Image.Portrait; Console.WriteLine(orentation); Console.ReadLine(); } ``` ### 密碼產生器 關於`Convert char[] to string`, 這只能透過[stackoverflow](https://stackoverflow.com/questions/1324009/net-c-sharp-convert-char-to-string)查, 暫時還不知道原因 說得明白一點, 就是這種資料型態JS沒有. > 我在 char[] 中存放了 '1','2','3'的陣列, 我希望能將這些資料轉換為 '123'的 String 型態. ```csharp= static void Main(string[] args) { var random = new Random(); var passwordLength = 10; var buffer = new char[passwordLength]; for(int i= 0; i < passwordLength; i++) { buffer[i] = (char)('a' + random.Next(0, 26)); } // 因為要得到char的值, 所以要new一個instance出來, 並借用多載的方法 var password = new string(buffer); Console.Write(buffer); Console.ReadLine(); //Console.WriteLine((int)'a'); // ASCII CODE 97 //Console.ReadLine(); } ``` ## 陣列和集合 基本上這兩個, 都沒有辦法直接console出來, 都要透過foreach; Array比較多是用寫好的方法, 類似prototype. List比較像是js, 可以在new出來的物件上使用. ### Array 很明顯的看的出來, 陣列的一些用法基本上和JS沒有太大的差異. 1. 獲取集合長度 ```csharp= var numbers = new[] { 3, 7, 9, 2, 14, 6}; Console.WriteLine(numbers.Length); ``` 2. 獲取元素在陣列中的位置 ```csharp= var index = Array.IndexOf(numbers, 9); Console.WriteLine(index); ``` 3. 清除陣列前兩個元素 因為是數字的陣列, 因此會以0替代 ```csharp= Array.Clear(numbers, 0, 2); for (int i = 0; i < numbers.Length; i++) { Console.WriteLine(numbers[i]); } foreach (var item in numbers) { Console.WriteLine(item); // 0, 0, 9, 2, 14, 6 } ``` 4. Copy陣列 ```csharp= int[] newNumbers = new int[3]; Array.Copy(numbers, newNumbers, 3); foreach (var item in newNumbers) { Console.WriteLine(item); } ``` 5. Reverse和Sort ```csharp= Array.Sort(numbers); foreach (var item in numbers) { Console.WriteLine(item); } Array.Reverse(numbers); foreach(var item in numbers) { Console.WriteLine(item); } ``` ### List 裡面有講到, 如果是`I`開頭, 基本上就是界面. ```csharp= var numbers = new List<int>() { 1, 2, 3, 4, 5}; ``` 1. Add: 增加單一元素(有點像是PUSH) ```csharp= var numbers = new List<int>() { 1, 2, 3, 4, 5}; // Add numbers.Add(1); ``` 2. AddRange: 增加另外一個集合 ```csharp= numbers.AddRange(new int[3] { 7, 8, 9 }); foreach(var item in numbers) { Console.Write(item); } ``` 3. index 的多用途 ```csharp= // 回傳相對應的index var Index = numbers.IndexOf(1); // 回傳重後面數來符合的index var lastIndex = numbers.LastIndexOf(1); Console.WriteLine($"index : { Index}, lastIndex : {lastIndex}"); ``` 4. Count: 計算集合長度 ```csharp= // Array是用length來計算長度, 集合改用count Console.WriteLine(numbers.Count); ``` 5. 移除(Remove) 相對於js的splice, 這個也太方便了吧 ```csharp= numbers.Remove(1); //因為只能刪除第一個是1的值,所以可以做底下的變形方法 //但是在集合中, 是不能就此改變集合, 因此要用傳統陣列的方法 foreach (var item in numbers) { if (item == 1) { numbers.Remove(item); } } ``` ```csharp= for(int i = 0; i < numbers.Count; i++) { if(numbers[i] == 1) { numbers.Remove(numbers[i]); } } foreach (var item in numbers) { Console.Write(item); } ``` 6. 清除所有元素 ```csharp= numbers.Clear(); ``` ## time ```csharp= var dateTime = new DateTime(2020, 10, 4); // DateTime是immurable的 var nextYear = dateTime.AddYears(1); Console.WriteLine(nextYear); var now = DateTime.Now; // 2020/10/6 下午 04:03:36 var today = DateTime.Today; // 2020/10/6 上午 12:00:00 var tommorrow = now.AddDays(1); var yesterday = now.AddDays(-1); //格式化 Console.WriteLine(now.ToString("yyyy-MM-dd hh:mm")); var timespan = new TimeSpan(1, 2, 3); var timespan1 = new TimeSpan(1, 0, 0); var start = DateTime.Now; var end = start.AddMinutes(2); var duration = end - start; Console.WriteLine(duration); // Properties // 往前/後移動幾分鐘 Console.WriteLine(timespan.Add(TimeSpan.FromMinutes(8))); Console.WriteLine(timespan.Subtract(TimeSpan.FromMinutes(2))); // ToString, 轉型 Console.WriteLine(timespan.ToString()); // Parse, 轉型 Console.WriteLine(TimeSpan.Parse("01:02:03")); Console.ReadLine(); ```