zoukankan      html  css  js  c++  java
  • C#考核知识点总结

    根据string查找对应的枚举状态

    我使用了循环遍历获得枚举状态的集合,然后foreach进行比较,忘记了直接将字符串解析为枚举值。

    //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;

    使用随机数

    我在使用随机数时,写在了循环里面,这样会造成多余的内存开销,是不可取的。主要原因是没有注意内存优化的意识和习惯。

    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;
    }

    计算日期公式

    我对日期的计算公式不太熟悉,百度到的公式直接使用了。需要对日期相关的操作和api多加学习和练习。

    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);
    }

    正确写法

    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;
  • 相关阅读:
    苹果新的编程语言 Swift 语言进阶(一)--综述
    IOS框架和服务
    IOS 与ANDROID框架及应用开发模式对比一
    第十六篇 --Android服务之网络服务发现服务
    第十七篇 --ANDROID DisplayManager 服务解析一
    苹果新的编程语言 Swift 语言进阶(十四)--扩展
    苹果新的编程语言 Swift 语言进阶(十三)--类型检查与类型嵌套
    苹果新的编程语言 Swift 语言进阶(十二)--选项链
    苹果新的编程语言 Swift 语言进阶(十一)--实例的初始化与类的析构
    苹果新的编程语言 Swift 语言进阶(九)--方法和下标
  • 原文地址:https://www.cnblogs.com/errornull/p/10435814.html
Copyright © 2011-2022 走看看