C#知识点-09(Hashtable集合,装箱和拆箱,泛型集合,File文件操作)

Hashtable-键值对集合(非泛型)

一个键对应一个值,健是唯一的不能重复,值随便可以重复
便利键值对集合使用foreach循环

internal class Program
    {
        static void Main(string[] args)
        {
            Hashtable ht = new Hashtable();
            ht.Add(1, 12);
            ht.Add(2, "张三");
            ht.Add(true, false);
            ht.Add(3, new int[] { 1, 2, 3 });
            ht.Add(new Person(), 13);
            ht[4] = "李四";
            ht[5] = new Person();
            ht[1] = 15;//将键为1的键值对的值重新赋值为15
            foreach (var item in ht.Keys)
            {
                Console.WriteLine("键--{0},值--{1}",item,ht[item]);
            }
            Console.ReadKey();
        }
    }
    class Person { }

给键值对集合添加数据时可以先判断集合中是否有重复的健,如果没有则添加相应键值对
 

 if (!ht.ContainsKey(2))
            {
                ht[2] = "李四";
            }

装箱和拆箱

装箱:值类型转换为引用类型
拆箱:引用类型转换为值类型
 

            int n = 100;
            object o = n;//装箱

            int n2 = (int)o;//拆箱

但是,装箱与拆箱只发生在两者类型之间存在继承关系的时候,如果两者之间不存在继承关系,则无论怎么转换都不会发生装箱或者拆箱
 

            int n3 = 123;
            string str = n3.ToString();
            str = "123";
            n3 = Convert.ToInt32(str);
            //这段代码就没有发生装箱与拆箱

写代码应该避免装箱和拆箱,因为装箱和拆箱很浪费资源。
比如说第一段装箱代码。先在栈中开辟了一块空间,里面存储了100,命名为n。又在栈中另外开辟了一块空间,命名为o,这个o在栈中存储的是它指向的堆中的开辟空间的地址。关键的一步来了,o在堆中开辟空间会存储100,这个100是怎么来的呢?是将n在栈中的100复制了一份,然后将它copy给了o在堆中的空间。而复制这一操作如果多了相对来说就会导致程序变得很慢。
而第二段代码中,是n3先在栈中开辟了一块空间,存储123。然后又在栈中开辟了一块空间,命名为str,指向堆中新开辟的一块空间。堆中的空间存储123,这个123并不是copy来的,而是直接写在堆中空间的。所以这个操作就快

泛型集合(List,Dictionary)

            List<int> list = new List<int>();//这个集合只能添加int类型的数据
            list.Add(1);
            list.Add(2);
            list.AddRange(new int[] {1,2,3,4});
            for (int i = 0; i < list.Count; i++)
            {
                Console.WriteLine(list[i]);
            }

            Dictionary<int,string> dict = new Dictionary<int,string>();
            dict.Add(1, "张三");
            dict.Add(2, "李四");
            foreach (int item in dict.Keys)//可以用int也可以用var
            {
                Console.WriteLine(dict[item]);
            }

File文件操作

编码
ANSI 获取操作系统默认编码
GB-2312 简体中文
UTF-8 针对Unicode的可变长度字符编码

File.Create(path)  创建文件 (path:文件路径)
FIle.Exists(path)  判断文件是否存在
File.Delete(path) 删除文件
File.Copy(path,path2) 复制文件(path2:复制到的文件的地址)
File.Move(path,path2) 移动文件

File读取数据
File.ReadAllText(path) 将读取的txt的数据返回为一整个字符串
string str = File.ReadAllText(path,Encoding.GetEncoding("GB2312"))使用某种编码读取数据
string[] strs = File.ReadAllLines(path,Encoding.GetEncoding("GB2312")) 一行一行读取数据
byte[] buffer = File.ReadAllBytes(path) 以二进制的方式读取数据,返回一个字节数组
string str = Encoding.Default.GetString(buffer,0,buffer.Length) 解码,将字节数组转换为我们能看懂的字符串格式的数据,从索引为0的数组开始截取,截取buffer.Length个字节

File写入数据
File.AppendText(path,"我是追加进来的新字符串")  往一个文件里追加数据
File.WriteAllLines(path,new string[]{"a","b"}) 将一个文件写入数据,数据类型要求字符串数组,写入的数据会覆盖原有数据
File.WriteAllBytes(path, bytes) 将字节类型的数据写入到某个文件

            string path = @"C:\Users\Desktop\实验.txt";
            string str = "床前明月光";
            byte[] bytes = Encoding.Default.GetBytes(str);
            File.WriteAllBytes(path, bytes);

 Directory 文件夹操作
string path = @"C:\Users\Desktop\new";
Directory.CreateDirectory(path) 创建了一个“new”文件夹
Directory.Delete 删除文件夹
string[] linePath = Directory.GetFiles(path) 拿取指定目录下所有文件的路径

Path 操作(Path操作的是字符串,没有办法改变真实的文件的路径,相当于只能改控制台显示的路径)
string path = @"C:\Users\Desktop\实验.txt";
Path.GetFileName(path) 获取指定位置字符串的文件名和扩展名
Path.GetFileNameWithoutExtension(path) 获取指定位置字符串的文件名,不包含扩展名
Path.GetDirectoryName(path) 获取文件所在文件夹的路径
string path1 = @"c:\a\b";
string path2 = @"a.txt";
string path3 = Path.Combine(path1, path2); 将两个字符串组合成一个路径
string path4 = Path.ChangeExtension(path, ".mp3") 更改路径字符串的扩展名

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值