第十三课

88 阅读6分钟

复习

```/*using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace test1
{


    internal class 第十二课
    {
        public class M // 基本类
        {
            // 构造方法 
            public M(int num1)
            {
                m_num = num1;
            }
            //字段 
            public int m_num;
            public int num=1;
            public static int num2=2;
            //属性 
            public string str
            {
                get; // 没有赋值相当于是字段
                
                set;
            }
            // 函数 
          static  public void getnum()
            {
                Console.WriteLine(num2); //静态方法只能访问静态的成员
            }
            public virtual void show()
            {
                Console.WriteLine("父类"); //虚方法
            }

            public new void show2()
            {
                Console.WriteLine("隐藏父类"); // 隐藏父类

            }
        }
        class M1 : M // 子类继承
        {
            //构造
            public M1(int num, string str1) : base(num)
            {
              this.str = str1;

            }
            public override void show()
            {
                Console.WriteLine("子类"); // 重写父类的虚方法
            }
            public  void show2()
            {
                Console.WriteLine("隐藏子类"); // 重写父类的虚方法
            }
            public string str;
        }

        static void  Main(string[] args)
        {
            // 面向对象 继承多态封装 
            // 多肽 虚函数(在派生类对基本类的函数进行重写 ) 隐藏方法 给基类的函数加上new 

            M m = new M(1);  // 字段有默认值0
            Console.WriteLine(m.num);
            M.getnum(); //静态方法使用方法

            // 子类创建实例
            M1 m2=new M1(2,"s");
            m2.show();
            m2.show2();
            Console.WriteLine(m2.num);
             
        }
    }
}
*/

文件类


```js/*using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace test1
{
    internal class 第十二课_file类
    {
          static void Main(string[] args)
        {
            //c#本质在学什么,各种类库的使用
            //File类,读写文件―整个文件信息一次性全部读取过来|
            string str = File.ReadAllText("./1.txt",Encoding.UTF8); //'绝对路径相对路径拿到所有的文本信息
            Console.WriteLine(str);
            // 读取所有整行的信息  放进数组中去
            string[] strArray = File.ReadAllLines("./1.txt");
            foreach(string i in strArray)
            {
                Console.WriteLine("第i行"+i); //打印每一行的信息
            }
            //添加信息  两种 追加 替换 (默认);
            File.WriteAllText("./1.txt","替换的内容 ");
            string[] str3 = { "1", "2", "3", "4" };
            File.AppendAllLines("./1.txt", str3);
            //追加
            File.AppendAllText("./1.txt","\n在末尾追加的内容");


        }
    }
}
    */
接口、

```/*
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace test1
    
{


    public class Animal
    {
        public void sleep()
        {
            Console.WriteLine("睡觉");
        }
    }

    public interface Flyable
    {
        int num { get; set; } //里面的get  set 实质上是没有函数提的函数 
        void fly (); // 默认都是public ;

        void skating();
    }

    public interface Eat
    {
        void eat();
    }

    //一个接口集成多个接口
    public interface SuperFace : Flyable, Eat { }
    public interface SuperFace2 : Flyable, Eat { } // 接口细分,可以套更多的接口

    class bird : Animal,Flyable,Eat // 类和接口同时存在时 吧类放在前面上
    {
        private int num1;
        int Flyable.num { get => num1; set { num1 = value; } }
        // set 不需要返回值 ( =》输出返回值)
         // 有重名时
        *//* void Flyable. fly()
         {
             Console.WriteLine("飞");
         }

         void Flyable.skating()
         {
             Console.WriteLine("滑行");
         }
        void Eat.eat()
         {
             Console.WriteLine("吃");
         }*//*
        //没有重名
       
       public void fly()
        {
            Console.WriteLine("飞");
        }

        public void  skating()
        {
            Console.WriteLine("滑行");
        }
        public void  eat()
        {
            Console.WriteLine("吃1");
        }

        void Eat.eat()
        {
            Console.WriteLine("吃2");
        }

        internal class 十二课_接口
        {
            static void Main(string[] args)
            {
                bird b1 = new bird();
                Eat.eat();
                
            }


        }



    }
}
*/

泛型类

using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace test1
{
    public class MYmath<T> // 创建一个泛型类 t的类型由创建对象的时候决定、
    {
        public T GetNum(T num1,T num2)
        {
            //return =num1+num2 //不能相加  因为 t 的类型没有确定
         
             
            //定义一个动态的 变量 
            //动态类型 可以将泛型的值赋给动态类型的量这样就可以进行运算操作
            dynamic num3 = num1;
            dynamic num4 = num2;
            return num3+num4;
        }
    }



    internal class 第十二课_泛型类
    {

        static void Main(string[] args)
        {
            /*            MYmath<int> math = new MYmath<int>();
                        MYmath<string> math2 = new MYmath<string>();
                        Console.WriteLine(math2.GetNum("string","abs1"));
                        Console.WriteLine(math.GetNum(123,345));*/

            //集合类 列表 ,集合 ,栈,线性表
            //列表 之前学的数组 有什么问题。
            // 定义一个泛型列表 
            /*            List<int> list = new List<int>() { 1, 2 };//0括号是指定容量 元素长度cout 列表的容量capacity
                        Console.WriteLine(list.Count); //如果没有值的话 原元素个数就是0;
                        Console.WriteLine(list.Capacity); //列表的容量是翻倍增长的
                        list.Add(45); //1末尾添加 
                        Console.WriteLine(list[2]);
                        Console.WriteLine(list[list.Count - 1]);// 2读取最后一个的值

                        list.Insert(0, 5); //3在下标0的位置上插入5;
                        Console.WriteLine(list[0]);

                        list.RemoveAt(0); //4删除指定下标的元素

                        int[] intarrary = { 0, 0, 0 };
                        list.AddRange(intarrary); //5利用数组循环添加
                        foreach (int i in list)
                        {
                            Console.WriteLine("元素{0}", i);
                        }

                        // 集合类 字典 键 和值
                        Dictionary<string, string> dic = new Dictionary<string, string>(); //一个键一个值
                        dic.Add("name", "麻辣王子"); //前面表示键名 ,后面表示值
                        Dictionary<string, string> dic2 = new Dictionary<string, string>();
                        dic.Add("name2", "小明");

                        //转成字典类型 后合并后成一个字典 ;
                        dic = dic.Concat(dic2).ToDictionary(x => x.Key, y => y.Value);
                        foreach (string k in dic.Keys) //遍历名
                        { 
                            Console.WriteLine("键为{0}", k);

                        }
                        foreach (string k in dic.Values) //遍历值
                        {
                            Console.WriteLine("值为{0}", k);
                        }
                        foreach (KeyValuePair<string,string> k in dic) //遍历键值对 keyvaluepair  
                        {
                            Console.WriteLine("键为{0},值为{1}",k.Key,k.Value);
                        }
                        Console.WriteLine(dic.ContainsValue("麻辣王子"));// 查找是否存在 可以查看是否纯在的用户名

                        //1.练习一:将一个数组中的奇数放到一个集合中,再将偶数放到另一个集合中,
                        // 最终将两个集合合并为一个集合,并且奇数显示在左边,偶数显示在右边

                        int[] intarr = {1,3,4,5,6,7,8,9,10};
                        List<int> list1 = new List<int>();
                        List<int> list2 = new List<int>();  
                        foreach (int i in intarr)
                        {
                            if (i % 2 != 0) // 如果是奇数的话
                            {
                                list1.Add(i);
                            }
                            else
                            {
                                list2.Add(i);
                            }
                        }

                        list1=list1.Concat(list2).ToList(); // 合并两个列表
                        foreach(int i in list1)
                        {
                            Console.WriteLine(i);
                        }

                        // 2.练习二:使用字典的方式计算出任意字符串中每个字符出现的次数
                        // maddfdfmdf m 
                        string str01 = "maddfdfmdf ";
                        Dictionary<char, int> dic01 = new Dictionary<char, int>(); //一个键一个值
                        foreach (char i in str01)
                        {

                            if(dic01.ContainsKey(i))//判断字典重有没有对应的键名
                            {
                                dic01[i]++;  // 值加一 
                            }
                            else
                            {
                                dic01.Add(i, 1);     //如果没有则初始化     
                            }
                        }
                        foreach (KeyValuePair<char,int>k in dic01)
                        {
                            Console.WriteLine("字符为{0}出现次数为{1}",k.Key, k.Value);    
                        }*/

            // 大文件读取方式 FileStream文件流读取到的是字节,可以读取所有的文件
            FileStream fsRead = new FileStream("./2.txt", FileMode.OpenOrCreate, FileAccess.Read);
                // FileMode.OpenOrCreate, 如果文件不存在则创建 
                // FileAccess.Read 读的形式打开
                byte[] fsByte = new byte[1024*1024*4]; //规定读取最大的字节长度
            //开始读取文件 读取完返回的是实际读取到的字节数
            int rNum = fsRead.Read(fsByte);
            //根据字节数 , 将读取到的字节转换为字符串
            string a=Encoding.UTF8.GetString(fsByte,0,rNum);
            Console.WriteLine(rNum);
            Console.WriteLine(a);
            fsRead.Close(); // 关闭文件
            fsRead.Dispose();// 释放所占的资源

            // 写入 替换 追加

using (FileStream fdWrite =new FileStream("./2.txt",FileMode.Append,
    FileAccess.Write))
            {
                string b = "123456";
                //将字符串转化为字节
                byte[] fdByte =Encoding.UTF8.GetBytes(b);
                fdWrite.Write(fdByte);  //将文件信息使用追加的形式写入文件中 
            }

            using (FileStream fdWrite = new FileStream("./2.txt", FileMode.Create,
                FileAccess.Write))
            {
                string b = "123456";
                //将字符串转化为字节
                byte[] fdByte = Encoding.UTF8.GetBytes(b,0,4);
                fdWrite.Write(fdByte);  //将文件信息使用替换的形式写入文件中 
            }

            // 读取的是字符串 
            StreamReader fileRead = new StreamReader("./3.txt",Encoding.UTF8);
/*            string fileSting = fileRead.ReadLine() ;// 读取每一行的信息
            string allText = fileRead.ReadToEnd(); // 读取所有行的信息
            char fileChar =(char) fileRead.Read();// 读取字符 
            Console.WriteLine(fileSting);
            Console.WriteLine(allText);*/


        //    Console.WriteLine((char)fileRead.Read()); //逐个逐个去读取 ,
                                                      //有的话就返回该字符的十进制
                                                      //没有就返回-1
            fileRead.Close(); //关闭文档流


            //写入信息
/*            StreamWriter fileWrite = new StreamWriter("./3.txt");
            fileWrite.WriteLine("第一行"); //使用替换的形式 写入一行之后会默认加入一个换行符
            fileWrite.Write("不换号");// 使用替换的形式写入一行不换号
            fileWrite.WriteLine("第二行");
            fileWrite.Close(); 
*/

            // 做一个练习 输入每一行的内容 逐行写入到3.txt中 直到遇到q结束
            string str4 = "Dasdqasq";
            Console.WriteLine(str4.IndexOf("s")); //如果找到该字符串 第一次出现的位置 
                                                  //没有的话返回-1;

            //   StreamWriter FileWrite2 = new StreamWriter("./3.txt");
            //自己写的
            /*     while (true)
                 {

                     foreach(char i in str4)
                     {
                         if (i == 'q')
                         {
                             break;
                         }
                         else
                         {
                             FileWrite2.WriteLine(i);

                         }

                     }
                     FileWrite2.Close();
                     break;
                 }*/

            //老师方法
            /* while (true)
             { 
                 string addStr = Console.ReadLine();
                 // 什么时候跳出循环q找出来对应的值不为 - 1
                 int Qindex = addStr.IndexOf("q"); //q存在
                 if (Qindex != -1)
                 { //substring
                     addStr = addStr.Substring(0, Qindex);
                     FileWrite2.WriteLine(addStr);
                     break;
                 } 
                 else // q不存在
                 {
                     FileWrite2.WriteLine(addStr);
                 }

             }
             FileWrite2.Close();*/


            //字符串的一些方法 LastIndexOf,IndexOf,Substring
            string comparestr1 = "1234";
            string comparestr2 = "1234";
            // 如果相当则为0 如果不想等 则-1;
            Console.WriteLine("对比结果{0}",comparestr1.CompareTo(comparestr2));
            string Qstr = "123456 ";
            Qstr = Qstr.Substring(1, 4); //不包括2 从0开始截取 总共截取4个 0123
/*            var compareStr = comparestr1.Concat(comparestr2).ToString(); // 合并
            foreach (char i in compareStr)
            {
                Console.WriteLine(i);
            }*/
        // 字符串 引用类型
        //stringBuilder . 申请了一个动态内存空间
        StringBuilder builderStr1=new StringBuilder(4,20); // 基本是4 最大是5
        StringBuilder builderStr2=new StringBuilder("dsadasdasdas");
            builderStr1.Append("aasdd"); //追加到最后 
            builderStr1.Insert(0,"1"); //在指定下表位置插入内容
            builderStr1.Remove(0,1);// 从0 开始 删除, 删除一个字符
            builderStr1[0] = '2'; // 将第一个元素 更改为2
            Console.WriteLine(builderStr1);
            Console.WriteLine(builderStr1.Capacity); 




        }
    }
}