VR引擎开发0203

141 阅读4分钟

列表

列表很像数组,但列表的优势是,列表的容量是自动增加的,但相对而言,列表的开销也会比数组大

初始化列表 List<int> list = new List<int>() { 11, 3, 2,3,11 };// 容量,元素个数

列表 相当于是一个动态的存储空间,内存空间会根据元素的个数进行扩展 如果元素的个数为0,那么分配的容量就是0,如果小于等于4就是4,大于4小于8就是8,以后会翻倍扩展(4,8,16,32....

            List<int> list = new List<int>() { 11, 3, 2,3,11 };// 容量,元素个数
            Console.WriteLine(list.Count);
            Console.WriteLine(list.Capacity);
            
            foreach (int i in list)
            {
                Console.Write(i);
            }
            Console.WriteLine();

列表的一些操作

            list.Add(13);//往列表的最后一个元素后面添加新的值
            list.Insert(1, 0);//在指定下标位置插入元素
            list.Remove(11);//删除第一个找到的值
            list.RemoveAt(list.Count - 1);//删除指定下标位置的元素
            Console.WriteLine("下标位置"+list.IndexOf(11));//查找指定的元素,返回第一个下标的位置,没有就返回-1
            Console.WriteLine("下标位置"+list.LastIndexOf(11));//逆序查找
            list.AddRange(list2);//将list2添加到list中,会改变原来的列表
            list.RemoveRange(3, 3);//删除的起始下标位置,删除元素个数

字典

字典中存放的是一组组键值对

初始化字典

            Dictionary<string, string> dict = new Dictionary<string, string>()
            {
                {"name","马里奥" },{"name","路易吉"}
            };
            dict.Add("name", "桃花");//向字典中添加
            Console.WriteLine(dict["name"]);//通过键名读取字典中的值
            //遍历字典中的值
            foreach(KeyValuePair<string, string> kvp in dict)
            {
                Console.WriteLine(kvp.Key + kvp.Value);//获取键值对
            }
            foreach(string key in dict.Keys)//拿到字典中所有的键名
            {
                Console.WriteLine(key);
            }
            foreach(string value in dict.Values)//拿到字典中所有的值
            {
                Console.WriteLine(value);
            }
            
       Console.WriteLine(dict.ContainsKey("name"));//可以判断字典中是否有对应的键名,返回bool值
       Console.WriteLine(dict.ContainsValue("小花"));//可以判断字典中是否有对应的值,返回bool值

合并俩个字典

            Dictionary<string, string> dict2 = new Dictionary<string, string>();
            Dictionary<string, string> dict3 = new Dictionary<string, string>();
            dict2.Add("name", "xiaoming");
            dict2.Add("id", "12312312");
            dict3.Add("lll", "bog");
            dict3.Add("hai", "xiaoming");
            dict3.Add("hello", "xiaoming");
            dict2 = dict2.Concat(dict3).ToDictionary(x => x.Key, y => y.Value);
            foreach (string k in dict2.Keys)
            {
                Console.WriteLine(k);
            }

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

            int[] ints = { 1, 3, 2, 1, 5, 3, 5, 6 };
            List<int> ints1 = new List<int>();
            List<int> ints2 = new List<int>();
            for (int i = 0; i < ints.Length; i++)
            {
                if (ints[i]%2==0)
                {
                    ints1.Add(ints[i]);
                }
                else
                {
                    ints2.Add(ints[i]);
                }
            }
            ints1.AddRange(ints2);

使用字典的方式,计算出任意字符串中,每个字符出现的次数

            string str1 = "maddfsaflasfj0";
            Dictionary<char,int> dit3 = new Dictionary<char,int>(); 
            foreach(char c in ints1)
            {
                if (dit3.ContainsKey(c))
                {
                    dit3[c]++;
                }
                else
                {
                    dit3.Add(c, 1);
                }
            }

            foreach(KeyValuePair<char,int> kvp in dit3)
            {
                Console.WriteLine("字符"+kvp.Key +"出现"+ kvp.Value);
            }

大文件操作

file只能一次性读取文件信息, 读取大文件信息用FileStream类

        //读取的是字节,转成字符串 Encoding
        FileStream fsRead=new FileStream("./1.txt",FileMode.OpenOrCreate,FileAccess.Read);
            byte[] buffer=new byte[1024*1024*5];//最大读取的信息是5M
            //获取实际读取的字节数
            int fsNum =fsRead.Read(buffer);//开始读取字节信息
            //获取到的字节信息是不是要转成字符串,3个字节对应一个中文字符,一个字节对应8位二进制数
            string fStr=Encoding.UTF8.GetString(buffer,0,fsNum);
            Console.WriteLine(fStr);
            //关闭文件通道,释放所占的资源
            fsRead.Close();
            fsRead.Dispose();

            //往文件中写入信息
            using (FileStream fsWrite = new FileStream("./1.txt", FileMode.OpenOrCreate, FileAccess.Write))
            {
                //写入内容 必须是字节
                string str = "asfasd";
                byte[] buffer2 = Encoding.UTF8.GetBytes(str);
                fsWrite.Write(buffer2,0,buffer2.Length);
            }

FileStream可以读取所有的文件,包括图片,音频等等,写法比较麻烦。 读取大文件的非图片,音频信息,我们就可以使用StreamReader,StreamWriter(字符串)

            StreamReader sRead =new StreamReader("./1.txt",Encoding.UTF8);
            string RString = sRead.ReadToEnd(); //读取所有的信息
            Console.WriteLine(RString);
            string RArray1 = sRead.ReadLine(); //逐行读取信息,每次读取一行
            string RArray2 = sRead.ReadLine(); //逐行读取信息,每次读取一行
            Console.WriteLine(RArray1);
            Console.WriteLine(RArray2);
            char R =(char)sRead.Read();//读取每个字符
            Console.WriteLine(R);
            sRead.Close();

            //写入
            StreamWriter fsWrite2 = new StreamWriter("./1.TXT",true);//true表示,是否使用追加的形式
            fsWrite2.WriteLine("DAFAJSDKA");//换行
            fsWrite2.Write("DAFAJSDKA");
            fsWrite2.Write("DAFAJSDKA");
            fsWrite2.Close();//如果没有close就会认为你还没有结束写的操作

三种读取文件方法的对比

string fsStr = File.ReadAllText("./1.txt");//读出来字符串
FileStream fsRead=new FileStream("./1.txt",FileMode.OpenOrCreate,FileAccess.Read);/读出来字节
StreamReader fsRead =new StreamReader("./1.txt",Encoding.UTF8);//读出来字符串

从文件2.txt中读取到每一行的信息,把每一行中含有财大的一行信息存放到3.txt中

            //从文件2.txt中读取到每一行的信息,把每一行中含有财大的一行信息存放到3.txt中
            StreamReader fsRead3 = new StreamReader("./2.txt");
            StreamWriter fsWrite3 = new StreamWriter("./3.txt",true);
            string s1 = fsRead3.ReadToEnd();
            string[] sArray = s1.Split("\n");
            foreach(string s in sArray)
            {
                if (s.Contains("财大"))
                {
                    fsWrite3.WriteLine(s);
                }
                
            }
            //或者使用正则
            string pattern = @"财.*大";
            foreach (string s in sArray)
            {
                if (Regex.IsMatch(s, pattern))
                {
                    fsWrite3.WriteLine(s);
                }
            }

            fsWrite3.Close();
            fsRead3.Close();