C#基础加强第三天总结--集合与文件

集合与文件
1.    集合:List<T> Dictionary<TKey, TValue>
    List<T>一般用来存储,Dictionary一般用来查找
    
    List<T>                                Dictionary                        HashSet<T>
        -> 增                                -> 增                            -> 包含不重复元素
            构造方法                            Add
                
            Add                                    
            AddRange
            Insert
            InsertRange
        -> 删                                -> 删        
            Remove                                Remove
            RemoveAt
            Clear
        -> 改                                -> 改
            索引                                索引
        -> 查                                -> 查
            Contains                            ContainsKey
            IndexOf                                -> 键值对中,键不允许重复
            LastIndexOf
        -> 其他
            ToArray

2.    通用示例--不重复的随机数(之前的洗牌程序)
    随机生成10个1-20之间的数放到List中,要求这10个数不能重复,并且都是偶数(添加10次,可能循环很多次)
        
        List<int> list = new List<int>();
        Random r = new Random();
        while (list.Count < 10)  //这个思想很好
        {
            int temp = r.Next(1, 21);
            if (!list.Contains(temp) && temp % 2 == 0)
            {
                list.Add(temp);
            }
        }

3.    winform中让label显示滚动条的方法        
    拖一个panel控件,将其AllowScroll属性设置为true,再将label控件放到上面
        
4.    装箱 -- 值类型-->引用类型 本质:栈内存中的数据放到堆内存中,实现共享
    拆箱 --
    
    区分这三种情况: -->语法相同,功能不同
    强制类型转换/隐式类型转换    -->针对值类型,对简单数据的处理
    里氏转换原则                -->对引用类型数据的处理
    装箱和拆箱                    -->值类型和引用类型
            
    查看装箱几次,要反编译看IL代码,出现几次box,就装箱几次    
        
5.    文件操作类

    .NET是托管应用程序,但凡能够托管的对象都在底层的托管堆中
    但是文件在磁盘等其他介质上,所以并不属于托管堆,这就要求要考虑垃圾回收的问题
    使用using代码块 -- 内部调用dispose()方法
    using (FileStream fileStream = new FileStream(filePath, FileMode.Open)){}
    
    -> 流操作
        FileStream
            -> ReadByte
                while ((count = fileStream.ReadByte()) != -1)    
            -> Read
                while((count = fs.Read(bs,0,bs.Length))>0)
            -> WriteByte
                for (int i = 0; i < bs.Length; i++)
                {
                    fs.WriteByte(bs[i]);
                }
            -> Write
                fs.Write(bs, 0, bs.Length);                                                
    
6.    编码
    1)ASCII码 7位 0~127 表示英文
    2)unicode编码,又名UTF-8  采用双字节对字符进行编码 --> C#中用到的编码
    3)考虑到使用中,单字节比双字节用的多,unicode很浪费资源,UTF-8编码方式
       一部分:英文用一个字节;一部分:如汉字用两个字节;一部分:用了三个字节
    4)windows操作系统下的编码结构-->如简体中文操作系统
       默认是ANSI标准格式  =  Encoding.default  =  GB2312
    5)unicode big endian  -->  低位放在后面,方便人看
       unicode -->  高位放在后面(在内存中高位在后面),方便程序看
    
    能不能把汉字写到字节流中去呢?(字节流如何处理汉字?)
        汉字要指定编码格式,默认就是gb2312
        //getEncoding("编码格式")  返回值:与指定代码页关联的 Encoding。
        Encoding e = Encoding.getEncoding("gb2312");

        //byte[] getBytes(string s) 返回值:字节数组,包含对指定的字符集进行编码的结果
        byte[] bs = Encoding.getEncoding("gb2312").getBytes(str);
        
7.    StreamReader  StreamWriter File静态类
    -> 文本文件操作
        StreamWriter
            构造方法:public StreamReader(string path,Encoding encoding)
            while((line = reader.Readline())!=null){list.Add(line);}
            
        StreamReader
            构造方法:public StreamWriter(string path,bool append,Encoding encoding)
            WriteLine()方法
    
    File.ReadAllLines()方法源码
    
    private static string[] InternalReadAllLines(string path, Encoding encoding)
    {
        List<string> list = new List<string>();
        using (StreamReader reader = new StreamReader(path, encoding))
        {
            string str;
            while ((str = reader.ReadLine()) != null)
            {
                list.Add(str);
            }
        }
        return list.ToArray();
    }

     -> File静态类 是对StreamReader,StreamWriter进行了一个封装
       当对文件进行频繁操作时,不要使用File静态类
       
8.    File静态类
    
    File类的三个读取方法的区别
    ReadAllLines() ReadAllText()只能用来读取文本文件
    当要读取的文件是图片文件,多媒体文件,音乐文件等,只能用ReadAllBytes()
    
    读写数据的方法
    ReadAllBytes() 返回值是字符数组,需要将字节数组转换为字符串 Encoding.Default.GetString(字节数组)
    WriteAllBytes() 需要将字符串转换成字节数组 Encoding.Default.GetBytes(字符串)    
    
    常用静态方法
    1)将文本contents附加到文件path中     void AppendAllText(string path, string contents)
    2)判断文件path是否存在                bool Exists(string path)
    3)读取文本文件到字符串数组中        string[] ReadAllLines(string path)
    4)将文本contents保存到文件path中,会覆盖旧内容        void WriteAllText(string path, string contents)
    5)将字符串数组逐行保存到文件path中,会覆盖旧内容    WriteAllLines(string path, string[] contents)    

    
9.    路径Path
    1)Path.GetFileName()
    2)Path.GetFileNameWithoutExtension()
    3)Path.GetExtension
    4)Path.GetDirectoryName()
    5)Path.GetFullPath()
    6)Path.Combine()        

10.    文件夹Directory    
    Directory.GetFiles()
    Directory.GetDirectories()
    
    案例:在一个文件夹中找main.cs文件,并查看其是否有子文件夹
          如果有子文件继续执行这个操作,直至最后一个文件夹没有子文件夹
    
    存在复用-->写成方法  采用递归的方式
    递推体是什么? 跳出递归的条件?
    
11.    序列化和反序列化
    将一个对象按照一定的格式呈现出来,就是序列化
    数据和对象间互相转化,就要使用到序列化和反序列化
    (二进制序列化,XML序列化,JSON序列化)
    
    二进制序列化的方法
    1)在要进行序列化的对象的类前加上[Serializable]标记
    2)创建对象
    3)创建一个可序列化工具的对象BinaryFormatter
    4)调用Serialize()方法  Deserialize()方法
    
12.    答疑
    1)byte[] 字节数组 和 char[] 字符数组 的区别就在于中文 char[]可以使用两个字节存储中文
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值