美文网首页
c#面向对象6--File类(下)/List泛型集合/装箱和拆箱

c#面向对象6--File类(下)/List泛型集合/装箱和拆箱

作者: Mona_Song | 来源:发表于2021-04-25 09:34 被阅读0次

    Encoding类的几种方法(File用到)

    • unicode 由utf7、utf8、utf32(三种国际标准组合而成)
    • (Encoding.Default是ANSI)

    出现乱码了,尝试顺序 Default-utf8-Encoding.GetEncoding("GB2312")-Encoding.GetEncoding("GBK")
    出现乱码的原因:保存和打开的编码方式不一致

    GB2312:只有简体
    GBK:简体繁体都包含

    File类

    • File提供三种方式读取
      1.File.ReadAllBytes 除string类型外,还可以读取多媒体文件,图片文件等,因为所有的数据其实都是以字节行式存储的
      2.File.ReadAllLines 只能读取string类型,返回字符串数组(用foreach读取),因此可以精确操作每一行
      3.File.ReadAllTexts 只能读取string类型,返回字符串

    • 绝对路径和相对路径
      绝对路径:通过这个路径直接能在我的电脑中找到这个文件
      相对路径:文件相对于应用程序的路径(使用时直接写在此路径下的文件名即可)

    编程时最好使用相对路径,具有更好的可移植性

    • File提供三种方式写入(写入会覆盖):
      1.File.WriteAllBytes
      2.File.WriteAllLines 要写入字符串数组
      3.File.WriteAllTexts 要写入字符串

    • File写入不覆盖,提供三种方式:
      1.File.AppendText
      2.File.AppendAllText
      3.File.AppendAllLines

    • File类的缺点:只能读取小文件,因为他要一下子全部读取进来,读的过程耗费内存,读大文件需要用文件流;

    List泛型集合

    • ArrayList的问题:ArrayList里面的数据都是object类型,因此取出来的时候也是object类型,无法直接使用(需要转成对应的你需要的类型)
    • 解决方式:使用List泛型集合
    • List泛型集合同数组一样,有确切的类型(List泛型集合可以转化为数组)


      List的Add();方法
    • List泛型与ArrayList一样拥有
      Add();
      AddRange();
      Remove();
      RemoveAt();
      RemoveDange();
      Reverse();
      Sort();
      Insert();
      InsertRange();
      等方法;
    • List泛型集合可以转化为数组,使用List.ToArray();方法
      数组也可以转List,使用nums.ToList();

    装箱和拆箱

    为什么不用ArrayList和Hashtable了?
    装箱:把值类型转化成引用类型
    拆箱:把引用类型转化成值类型


    1为装箱执行的时间,2为未装箱执行的时间

    因此代码中应该尽量避免装箱和拆箱


    此过程竟然未拆箱
    • 看两种类型是否装箱或拆箱,要看两种类型是否有继承关系。有继承关系才有可能有装箱拆箱,否则没有。

    键值对集合Dictionary对应Hashtable

    • 键和值的类型都是确定的(声明的时候确定)
    • 与Hashtable的不同
      dictionary的类型固定,键和值的类型可以是int,float,string等,但是固定不变
      Dictionary<string, float> dic = new Dictionary<string, float>();
      Hashtable的类型不固定,不固定的意思是同一个hashtable种可以插入的键和值不同,比如可以插入(1,"张三")和(false,1)等类型不同的键值对
      Hashtable ht = new Hashtable();
    • Dictionary遍历的洋气用法


      洋气用法与原方法比较

    习题

    • 练习一
      将一个数组中的奇数放到一个集合中,偶数放到另一个集合中
      最终将两个集合合并为一个集合,且奇数显示在左边,偶数显示在右边
    namespace 泛型练习
    {
        class Program
        {
            static void Main(string[] args)
            {
                //将一个数组中的奇数放到一个集合中,偶数放到另一个集合中
                //最终将两个集合合并为一个集合,且奇数显示在左边,偶数显示在右边
                int[] s = {1,2,3,4,5,6,7,8,9,10,99,100,110,112,114};
                List<int> listji = new List<int>();
                List<int> listou = new List<int>();
                for (int i = 0; i < s.Length; i++)
                {
                    if (s[i] % 2 == 0)
                    {
                        listou.Add(s[i]);
                    }
                    else
                    {
                        listji.Add(s[i]);
                    }
                }
                listji.AddRange(listou);
                foreach (var item in listji)
                {
                    Console.Write(item+"  ");
                }
                Console.ReadKey();
            }
        }
    }
    

    自己写的代码的效果

                //将一个数组中的奇数放到一个集合中,偶数放到另一个集合中
                //最终将两个集合合并为一个集合,且奇数显示在左边,偶数显示在右边
                int[] s = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 99, 100, 110, 112, 114 };
                Hashtable OddHt = new Hashtable();
                Hashtable EvenHt = new Hashtable();
    
                for (int i = 0; i < s.Length; i++)
                {
                    if (s[i] % 2 == 0)
                    {
                        EvenHt.Add(i, s[i]);
                    }
                    else
                    {
                        OddHt.Add(i, s[i]);
                    }
                }
                foreach (var item in OddHt)
                {
                    Console.WriteLine("{0}-----{1}", item, OddHt[item]);
                }
                foreach (var item in EvenHt)
                {
                    Console.WriteLine("{0}-----{1}", item, EvenHt[item]);
                }
                Console.ReadKey();
    
    上图代码运行结果 更正后可以显示出正确结果
    正确运行结果
    • 练习二
                #region 练习二
                //提示用户输入一个字符串,通过foreach循环将用户输入的字符串赋值给一个字符数组
                Console.WriteLine("请输入一个字符串");
                string input = Console.ReadLine();
                char[] chs = new char[input.Length];
                int i = 0;
                foreach (char item in input)
                {
                    chs[i] = item;
                    Console.WriteLine(chs[i]);
                    i++;//(更正)不写也能正确输出,但是只有下标为0的数组位置存了最后一个字符
                }
                #endregion
    
    • 练习三
                #region 练习三
                //统计welcome to china中每个字符出现的次数 不考虑大小写
                //思路:字母是键,对应的出现次数是值
                Dictionary<char, int> dic = new Dictionary<char, int>();
                string s = "wElcome to China";
                //不考虑大小写
                s = s.ToLower();
                for (int i = 0; i < s.Length; i++)
                {
                    //消除空格
                    if(s[i] == ' ')
                    {
                        continue;
                    }
                    if (dic.ContainsKey(s[i]))
                    {
                        dic[s[i]]++;
                    }
                    else
                    {
                        dic[s[i]] = 1;
                    }
                }
                foreach (KeyValuePair<char,int> kv in dic)
                {
                    Console.WriteLine("{0}----{1}", kv.Key, kv.Value);
                }
                Console.ReadKey();
                #endregion
    

    相关文章

      网友评论

          本文标题:c#面向对象6--File类(下)/List泛型集合/装箱和拆箱

          本文链接:https://www.haomeiwen.com/subject/obsxkltx.html