# 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();
```