30天C#基礎鞏固------集合,File(文件操做 ),Encoding處理字符集

一:泛型html

   關於泛型我本身也不是很好的理解,可是具體的運用仍是能夠的,能夠這樣的理解,咱們定義一個數組,可是不知道未來它是保存什麼類型的值,非常矛盾,這個時候泛型就出現了,它能夠解決這個場景,list<T> 之前這裏是類型,前提是咱們知道這裏未來保存什麼值,如今不知道了使用T(Type)來表示,未來什麼類型的值均可以保存在裏面。這個在集合,項目底層一些公共的接口,類之中使用的特別多。數組

二:集合函數

線型集合----List<T>ui

image

            List<int> array = new List<int>();
            int[] str = { 0, 0, 0, 0, };
            array.Add(1);
            array.Add(2);
            array.Add(5);
            array.AddRange(str);      //這裏是添加一個數組到集合中。
            array.Remove(5);           //這裏是添加的是一個固定的數字。
            array.RemoveAt(1);       //這裏的item就是咱們數組的下標。咱們能夠利用這個刪除元素。
            array[0] = 23;              //修改第一個元素
            foreach (var item in array)         //這裏是關於集合的循環輸出。
            {
                Console.WriteLine(item.ToString());
            }
            Console.ReadKey();

離散集合編碼

Dictionary<string,int> dic=new Dictionary<string,int>();spa

            Dictionary<string, string> dic = new Dictionary<string, string>();
            //初始化
            dic.Add("張輝", "1193451014");
            dic.Add("ahui", "1193451014");
            dic.Add("小輝", "1193451014");
            dic.Add("王輝", "1193451014");
            bool a=dic.ContainsKey("ahui");                     //利用鍵來看是否在集合裏面保存
            Console.WriteLine(a);
            //這個鍵值對集合---咱們須要瞭解到如何循環的輸出
            foreach (KeyValuePair<string, string> item in dic)          //輸出的時候注意臨時變量(item)的類型-----KeyValuePair<string, string>
            {
                Console.WriteLine(item.Key + "," + item.Value);
            }
            Console.ReadKey();

三:文件操做3d

    文件是什麼:是硬盤裏面的一個內存,是一堆字節快。htm

image

1:命名空間blog

System.IO; //文件的命名空間

2:FileStream文件流,將文件以字節的方式進行讀寫。繼承

image

上面的圖片是關於文件的一些經常使用的方法和類。下面是一些練習。

--->FileStream文件流。

     1:關於文件流的寫。

咱們看一FileStream有哪些方法。都是一些構造函數。

image

---->WriteByte()方法

            //FileStream-----利用文件流來寫,第一個參數是文件名,第二個是枚舉類型,咱們選擇從新寫入。第三個是權限的選擇。            
            FileStream fWrite=new FileStream("ahui.txt",FileMode.Create,FileAccess.Write);
            fWrite.WriteByte(97);              //寫入了,可是咱們要是沒有調用display或者Flush就不會寫入文件,只是寫入緩衝期。
            //Flush()-----清除此流的緩衝區,使得全部緩衝的數據都寫入到文件中。
            fWrite.Flush();                        //這樣才能寫入文件中。
            Console.WriteLine(fWrite);
            Console.ReadKey();

上面的代碼要是咱們從客戶端輸入就會出現亂碼,咱們須要經過設置編碼的格式來修改。

----->Write()

            Console.WriteLine("請輸入?");
            string sInput = Console.ReadLine();
            //設置編碼格式----有助於咱們往文件中寫入漢字
            byte[] bs = Encoding.Default.GetBytes(sInput);
            fWrite.Write(bs,0,5);              //寫入了,可是咱們要是沒有調用display或者Flush就不會寫入文件,只是寫入緩衝期。

 

---->ReadByte()

            //利用using來寫,這個最後會自動的調用Display()方法 ,使咱們寫在緩衝區的內容寫入到文件中。
            using (FileStream fRead=new FileStream("ahui.txt",FileMode.Open,FileAccess.Read))
            {
                List<byte> list=new List<byte>();                //設置一個集合
                int res = -1;
                while ((res=fRead.ReadByte( ))!=-1)           //利用循環來把文件中的值添加到集合中
                {
                     list.Add((byte)res);                             //集合的Add()方法。
                }
            }     
            Console.ReadKey();

image

這裏的49和50是我文件中保存的值。

---->Read

            using (FileStream fReader=new FileStream("ahui.txt",FileMode.Open,FileAccess.Read))
            {
                //使用數組來存儲一個塊字節
                byte []bs=new byte[10];                                     //這個就至關於緩衝區同樣
                int count = fReader.Read(bs,0,bs.Length);        //要求讀取10個字節,從數組的第0位開始,所有存儲完。     
            }

image

---->複製文件

            //思路---------------先讀取文件,後寫入文件。
            Console.Write("請輸入你要複製的路徑#");
            string str = Console.ReadLine();
            if (!File.Exists(str))          //判斷文件是否存在
            {
                Console.WriteLine("文件不存在,,,你搞我呀,");
                Console.ReadKey();
                return; //直接跳出.
            }
            //走到這裏就表示文件存在
            Console.Write(" 請輸入要往哪裏複製#");
            string strM = Console.ReadLine();
            using (FileStream fReader=new FileStream(str,FileMode.Open,FileAccess.Read))                //進行讀的操做
            {
                using (FileStream rWrite=new FileStream(strM,FileMode.Create,FileAccess.Write))      //進行寫操做
                {
                    //第一種------利用ReadByte()和WriteByte()按照字節來進行處理
                    int res = -1;
                    while ((res=fReader.ReadByte())!=-1)             //這裏看是否讀取到值,是否進行循環,沒讀取到res=-1,則不進行寫入操做。
                    {
                        rWrite.WriteByte((byte)res);                     //參數只能是byte類型的,咱們須要強制類型轉換。
                    }                    
                }
            }
            Console.WriteLine("OK");
            Console.ReadKey();

image

image

上面的效率不是很高,咱們能夠利用Read()/Write()來進行,效率比以前的高不少。

                    //第二種------利用Read()和Write()按照字節來進行處理
                    //這裏利用的是buffer,咱們須要一個字節數組來處理。
                    byte [] buBytes=new byte[1024*1024*10];         //申請了一個10M大小的空間。                          
                    int count = 0;
                    while ((count = fReader.Read(buBytes, 0, buBytes.Length)) > 0)       //把讀取到的內容寫入到了buffer中,咱們只要文件中有值,count就會大於0。
                    {
                        rWrite.Write(buBytes, 0, count);                                   //把buffer中的值寫入到文件中。          
                    }  

四:Encoding處理字符集。

聲明一個字符編碼,

Encoding en = Encoding.GetEncoding("gb2312"); //聲明一個gb2312的字符編碼

獲得計算機中的全部字符編碼

            EncodingInfo[] ens = Encoding.GetEncodings();  //獲得全部的編碼 ,返回的是一個數組。+EncodingInfo是一個類,裏面有一些關於編碼的屬性。
            for (int i = 0; i <ens.Length ; i++)
            {
                Console.WriteLine("{0},{1},{2}",ens[i].CodePage,ens[i].DisplayName,ens[i].Name);
            }
            Console.ReadKey();

咱們經過控制檯能夠看到PC中的全部的編碼。

image

上面的代碼中有註釋,咱們能夠發現有些編碼咱們能夠經過一個類來聲明一個數組,這樣就能夠點 出來咱們的全部的編碼,其中有編碼的編碼數,編碼名稱,編碼說明。

eg:將數字轉換爲16進制。

            for (int i = 0; i < 17; i++)
            {
                Console.WriteLine(i.ToString("x2"));           //這裏面的x表示的是編碼的格式爲16進制。 2表示保留2位數。
            }
            Console.ReadKey();

五:關於繼承被初識化的調用問題

   子類繼承基類,當子類被初始化的時候,咱們是先調用基類的構造函數,在調用子類的構造函數,這裏有個叫作回溯的問題。是從裏到外的。

    /// <summary>
    /// 基類
    /// </summary>
    public class Parset
    {
        public Parset()
        {
            Console.WriteLine("基類被調用了。");
        }
    }
    /// <summary>
    /// 子類
    /// </summary>
    public class ChildA:Parset
    {
        private string name = "阿輝";
        public ChildA()
        {
            Console.WriteLine("子類被調用了,,,");
        }

        public void SayHello()
        {
            Console.WriteLine(name);
        }
    }
            ChildA ca=new ChildA();
            ca.SayHello();
            Console.ReadKey();

咱們經過這裏就能夠發現這個規則。

image

相關文章
相關標籤/搜索