C#考覈知識點總結

根據string查找對應的枚舉狀態api

我使用了循環遍歷得到枚舉狀態的集合,而後foreach進行比較,忘記了直接將字符串解析爲枚舉值。dom

//TODO 爲何不用C#的Api //考覈改正
try { return (PlayerStatus)Enum.Parse(typeof(PlayerStatus), str); } catch (Exception) { return PlayerStatus.None; } //個人寫法
foreach (PlayerStatus item in Enum.GetValues(typeof(PlayerStatus))) { if (Enum.GetName(item.GetType(), item) ==str) return item; } return PlayerStatus.None;

 

根據int查找對應的枚舉狀態學習

這裏和上一問題想法同樣,對枚舉不熟悉,形成我走了原路,須要對枚舉的知識多加學習和練習。優化

//TODO 爲何要循環?不直接強轉?
return (PlayerStatus) val; //遍歷玩家狀態枚舉類型的全部狀態
foreach (PlayerStatus item in Enum.GetValues(typeof(PlayerStatus))) { if ((int)item == val) return item; } return PlayerStatus.None;

 

使用隨機數ui

我在使用隨機數時,寫在了循環裏面,這樣會形成多餘的內存開銷,是不可取的。主要緣由是沒有注意內存優化的意識和習慣。spa

for (int i = 0; i < array.Length; i++) { //TODO 爲何要在循環裏面建立隨機數 形成多餘的內存開銷?-1
    Random random = new Random(Guid.NewGuid().GetHashCode()); randomNum = random.Next(0, array.Length-1); string temp = array[i]; array[i] = array[randomNum]; array[randomNum] = temp; }

 

計算日期公式code

我對日期的計算公式不太熟悉,百度到的公式直接使用了。須要對日期相關的操做和api多加學習和練習。orm

static void CalTimeToWeek(){ int year = 1985, month = 12, day = 8; int week = (day + 2 * month + 3 * (month + 1) / 5 + year + year / 4 - year / 100 + year / 400) % 7; string weekStr = ""; switch (week){ case 0: weekStr = "星期一";break; case 1: weekStr = "星期二";break; case 2: weekStr = "星期三";break; case 3: weekStr = "星期四";break; case 4: weekStr = "星期五";break; case 5: weekStr = "星期六";break; case 6: weekStr = "星期天";break; } Console.WriteLine(weekStr); }

正確寫法blog

static string CaculateWeekDay(int y, int m, int d){ //基姆拉爾森計算公式W=(d+2*m+3*(m+1)/5+y+y/4 -y/100+y/400)%7 //把1月和2月看作上一年的13,14月
    if (m == 1)m = 13; if (m == 2)m = 14; int week = (d + 2 * m + 3 * (m + 1) / 5 + y + y / 4 - y / 100 + y / 400) % 7; string weekStr = ""; switch (week){ case 1: weekStr = "星期一"; break; case 2: weekStr = "星期二"; break; case 3: weekStr = "星期三"; break; case 4: weekStr = "星期四"; break; case 5: weekStr = "星期五"; break; case 6: weekStr = "星期六"; break; case 7: weekStr = "星期日"; break; default: break; } Console.WriteLine(weekStr); return weekStr; }

 

日期格式的輸出內存

一樣是對日期相關的操做不熟悉,使用了比較笨的方法本身拼接字符串

Console.WriteLine($"{year}年{month}月{day}日 {hour}:{minute}:{second}"); //TODO 能夠用字符串格式來解決 不須要取那麼多數據本身拼接
Console.WriteLine(string.Format("{0:F}", datetime));

 

遍歷列表刪除指定數據

我當時只考慮到了遍歷時刪除不可取,可使用臨時數據來解決這一問題,可是會形成額外的內存開銷。

更好的寫法是在遍歷到對應數據刪除後直接break,就避免了全部問題。

int target = -1; for(int i = 0; i < list.Count; i++) { if (list[i].PlayerId == id) target = i; } if (target != -1) list.Remove(list[target]); else Console.WriteLine("沒有此ID!"); //TODO 使用倒敘進行列表刪除而且刪除後不在進行循環 不用開新的內存來存儲臨時數據 -1 /* for (int i = list.Count - 1; i >= 0; i--) { if (list[i].PlayerId == id) { list.Remove(list[i]); break; } }*/

 

經過string刪除指定字典鍵值對

我忘了直接找id而後刪除,而是繞了個圈子,將字典轉爲集合,找到該數據而後刪除(此處也犯了上一問題的錯誤),再轉爲字典。

//TODO 1.爲何不直接找Id 而後字典直接RemoveKey? //TODO 2.找到數據後爲何還要繼續循環? 不 Break?
int target = -1; for (int i = 0; i < list.Count; i++) { if (dictToList[i].PlayerName == name) { target = i; } } if (target != -1) dictToList.Remove(dictToList[target]); else Console.WriteLine("不存在該姓名!"); Dictionary<int, PlayerData> newDict = ListToDict(dictToList); return newDict;
相關文章
相關標籤/搜索