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") 更改路径字符串的扩展名