集合与文件
1. 集合:List<T> Dictionary<TKey, TValue>
List<T>一般用来存储,Dictionary一般用来查找
List<T> Dictionary HashSet<T>
-> 增 -> 增 -> 包含不重复元素
构造方法 Add
Add
AddRange
Insert
InsertRange
-> 删 -> 删
Remove Remove
RemoveAt
Clear
-> 改 -> 改
索引 索引
-> 查 -> 查
Contains ContainsKey
IndexOf -> 键值对中,键不允许重复
LastIndexOf
-> 其他
ToArray
2. 通用示例--不重复的随机数(之前的洗牌程序)
随机生成10个1-20之间的数放到List中,要求这10个数不能重复,并且都是偶数(添加10次,可能循环很多次)
List<int> list = new List<int>();
Random r = new Random();
while (list.Count < 10) //这个思想很好
{
int temp = r.Next(1, 21);
if (!list.Contains(temp) && temp % 2 == 0)
{
list.Add(temp);
}
}
3. winform中让label显示滚动条的方法
拖一个panel控件,将其AllowScroll属性设置为true,再将label控件放到上面
4. 装箱 -- 值类型-->引用类型 本质:栈内存中的数据放到堆内存中,实现共享
拆箱 --
区分这三种情况: -->语法相同,功能不同
强制类型转换/隐式类型转换 -->针对值类型,对简单数据的处理
里氏转换原则 -->对引用类型数据的处理
装箱和拆箱 -->值类型和引用类型
查看装箱几次,要反编译看IL代码,出现几次box,就装箱几次
5. 文件操作类
.NET是托管应用程序,但凡能够托管的对象都在底层的托管堆中
但是文件在磁盘等其他介质上,所以并不属于托管堆,这就要求要考虑垃圾回收的问题
使用using代码块 -- 内部调用dispose()方法
using (FileStream fileStream = new FileStream(filePath, FileMode.Open)){}
-> 流操作
FileStream
-> ReadByte
while ((count = fileStream.ReadByte()) != -1)
-> Read
while((count = fs.Read(bs,0,bs.Length))>0)
-> WriteByte
for (int i = 0; i < bs.Length; i++)
{
fs.WriteByte(bs[i]);
}
-> Write
fs.Write(bs, 0, bs.Length);
6. 编码
1)ASCII码 7位 0~127 表示英文
2)unicode编码,又名UTF-8 采用双字节对字符进行编码 --> C#中用到的编码
3)考虑到使用中,单字节比双字节用的多,unicode很浪费资源,UTF-8编码方式
一部分:英文用一个字节;一部分:如汉字用两个字节;一部分:用了三个字节
4)windows操作系统下的编码结构-->如简体中文操作系统
默认是ANSI标准格式 = Encoding.default = GB2312
5)unicode big endian --> 低位放在后面,方便人看
unicode --> 高位放在后面(在内存中高位在后面),方便程序看
能不能把汉字写到字节流中去呢?(字节流如何处理汉字?)
汉字要指定编码格式,默认就是gb2312
//getEncoding("编码格式") 返回值:与指定代码页关联的 Encoding。
Encoding e = Encoding.getEncoding("gb2312");
//byte[] getBytes(string s) 返回值:字节数组,包含对指定的字符集进行编码的结果
byte[] bs = Encoding.getEncoding("gb2312").getBytes(str);
7. StreamReader StreamWriter File静态类
-> 文本文件操作
StreamWriter
构造方法:public StreamReader(string path,Encoding encoding)
while((line = reader.Readline())!=null){list.Add(line);}
StreamReader
构造方法:public StreamWriter(string path,bool append,Encoding encoding)
WriteLine()方法
File.ReadAllLines()方法源码
private static string[] InternalReadAllLines(string path, Encoding encoding)
{
List<string> list = new List<string>();
using (StreamReader reader = new StreamReader(path, encoding))
{
string str;
while ((str = reader.ReadLine()) != null)
{
list.Add(str);
}
}
return list.ToArray();
}
-> File静态类 是对StreamReader,StreamWriter进行了一个封装
当对文件进行频繁操作时,不要使用File静态类
8. File静态类
File类的三个读取方法的区别
ReadAllLines() ReadAllText()只能用来读取文本文件
当要读取的文件是图片文件,多媒体文件,音乐文件等,只能用ReadAllBytes()
读写数据的方法
ReadAllBytes() 返回值是字符数组,需要将字节数组转换为字符串 Encoding.Default.GetString(字节数组)
WriteAllBytes() 需要将字符串转换成字节数组 Encoding.Default.GetBytes(字符串)
常用静态方法
1)将文本contents附加到文件path中 void AppendAllText(string path, string contents)
2)判断文件path是否存在 bool Exists(string path)
3)读取文本文件到字符串数组中 string[] ReadAllLines(string path)
4)将文本contents保存到文件path中,会覆盖旧内容 void WriteAllText(string path, string contents)
5)将字符串数组逐行保存到文件path中,会覆盖旧内容 WriteAllLines(string path, string[] contents)
9. 路径Path
1)Path.GetFileName()
2)Path.GetFileNameWithoutExtension()
3)Path.GetExtension
4)Path.GetDirectoryName()
5)Path.GetFullPath()
6)Path.Combine()
10. 文件夹Directory
Directory.GetFiles()
Directory.GetDirectories()
案例:在一个文件夹中找main.cs文件,并查看其是否有子文件夹
如果有子文件继续执行这个操作,直至最后一个文件夹没有子文件夹
存在复用-->写成方法 采用递归的方式
递推体是什么? 跳出递归的条件?
11. 序列化和反序列化
将一个对象按照一定的格式呈现出来,就是序列化
数据和对象间互相转化,就要使用到序列化和反序列化
(二进制序列化,XML序列化,JSON序列化)
二进制序列化的方法
1)在要进行序列化的对象的类前加上[Serializable]标记
2)创建对象
3)创建一个可序列化工具的对象BinaryFormatter
4)调用Serialize()方法 Deserialize()方法
12. 答疑
1)byte[] 字节数组 和 char[] 字符数组 的区别就在于中文 char[]可以使用两个字节存储中文
1. 集合:List<T> Dictionary<TKey, TValue>
List<T>一般用来存储,Dictionary一般用来查找
List<T> Dictionary HashSet<T>
-> 增 -> 增 -> 包含不重复元素
构造方法 Add
Add
AddRange
Insert
InsertRange
-> 删 -> 删
Remove Remove
RemoveAt
Clear
-> 改 -> 改
索引 索引
-> 查 -> 查
Contains ContainsKey
IndexOf -> 键值对中,键不允许重复
LastIndexOf
-> 其他
ToArray
2. 通用示例--不重复的随机数(之前的洗牌程序)
随机生成10个1-20之间的数放到List中,要求这10个数不能重复,并且都是偶数(添加10次,可能循环很多次)
List<int> list = new List<int>();
Random r = new Random();
while (list.Count < 10) //这个思想很好
{
int temp = r.Next(1, 21);
if (!list.Contains(temp) && temp % 2 == 0)
{
list.Add(temp);
}
}
3. winform中让label显示滚动条的方法
拖一个panel控件,将其AllowScroll属性设置为true,再将label控件放到上面
4. 装箱 -- 值类型-->引用类型 本质:栈内存中的数据放到堆内存中,实现共享
拆箱 --
区分这三种情况: -->语法相同,功能不同
强制类型转换/隐式类型转换 -->针对值类型,对简单数据的处理
里氏转换原则 -->对引用类型数据的处理
装箱和拆箱 -->值类型和引用类型
查看装箱几次,要反编译看IL代码,出现几次box,就装箱几次
5. 文件操作类
.NET是托管应用程序,但凡能够托管的对象都在底层的托管堆中
但是文件在磁盘等其他介质上,所以并不属于托管堆,这就要求要考虑垃圾回收的问题
使用using代码块 -- 内部调用dispose()方法
using (FileStream fileStream = new FileStream(filePath, FileMode.Open)){}
-> 流操作
FileStream
-> ReadByte
while ((count = fileStream.ReadByte()) != -1)
-> Read
while((count = fs.Read(bs,0,bs.Length))>0)
-> WriteByte
for (int i = 0; i < bs.Length; i++)
{
fs.WriteByte(bs[i]);
}
-> Write
fs.Write(bs, 0, bs.Length);
6. 编码
1)ASCII码 7位 0~127 表示英文
2)unicode编码,又名UTF-8 采用双字节对字符进行编码 --> C#中用到的编码
3)考虑到使用中,单字节比双字节用的多,unicode很浪费资源,UTF-8编码方式
一部分:英文用一个字节;一部分:如汉字用两个字节;一部分:用了三个字节
4)windows操作系统下的编码结构-->如简体中文操作系统
默认是ANSI标准格式 = Encoding.default = GB2312
5)unicode big endian --> 低位放在后面,方便人看
unicode --> 高位放在后面(在内存中高位在后面),方便程序看
能不能把汉字写到字节流中去呢?(字节流如何处理汉字?)
汉字要指定编码格式,默认就是gb2312
//getEncoding("编码格式") 返回值:与指定代码页关联的 Encoding。
Encoding e = Encoding.getEncoding("gb2312");
//byte[] getBytes(string s) 返回值:字节数组,包含对指定的字符集进行编码的结果
byte[] bs = Encoding.getEncoding("gb2312").getBytes(str);
7. StreamReader StreamWriter File静态类
-> 文本文件操作
StreamWriter
构造方法:public StreamReader(string path,Encoding encoding)
while((line = reader.Readline())!=null){list.Add(line);}
StreamReader
构造方法:public StreamWriter(string path,bool append,Encoding encoding)
WriteLine()方法
File.ReadAllLines()方法源码
private static string[] InternalReadAllLines(string path, Encoding encoding)
{
List<string> list = new List<string>();
using (StreamReader reader = new StreamReader(path, encoding))
{
string str;
while ((str = reader.ReadLine()) != null)
{
list.Add(str);
}
}
return list.ToArray();
}
-> File静态类 是对StreamReader,StreamWriter进行了一个封装
当对文件进行频繁操作时,不要使用File静态类
8. File静态类
File类的三个读取方法的区别
ReadAllLines() ReadAllText()只能用来读取文本文件
当要读取的文件是图片文件,多媒体文件,音乐文件等,只能用ReadAllBytes()
读写数据的方法
ReadAllBytes() 返回值是字符数组,需要将字节数组转换为字符串 Encoding.Default.GetString(字节数组)
WriteAllBytes() 需要将字符串转换成字节数组 Encoding.Default.GetBytes(字符串)
常用静态方法
1)将文本contents附加到文件path中 void AppendAllText(string path, string contents)
2)判断文件path是否存在 bool Exists(string path)
3)读取文本文件到字符串数组中 string[] ReadAllLines(string path)
4)将文本contents保存到文件path中,会覆盖旧内容 void WriteAllText(string path, string contents)
5)将字符串数组逐行保存到文件path中,会覆盖旧内容 WriteAllLines(string path, string[] contents)
9. 路径Path
1)Path.GetFileName()
2)Path.GetFileNameWithoutExtension()
3)Path.GetExtension
4)Path.GetDirectoryName()
5)Path.GetFullPath()
6)Path.Combine()
10. 文件夹Directory
Directory.GetFiles()
Directory.GetDirectories()
案例:在一个文件夹中找main.cs文件,并查看其是否有子文件夹
如果有子文件继续执行这个操作,直至最后一个文件夹没有子文件夹
存在复用-->写成方法 采用递归的方式
递推体是什么? 跳出递归的条件?
11. 序列化和反序列化
将一个对象按照一定的格式呈现出来,就是序列化
数据和对象间互相转化,就要使用到序列化和反序列化
(二进制序列化,XML序列化,JSON序列化)
二进制序列化的方法
1)在要进行序列化的对象的类前加上[Serializable]标记
2)创建对象
3)创建一个可序列化工具的对象BinaryFormatter
4)调用Serialize()方法 Deserialize()方法
12. 答疑
1)byte[] 字节数组 和 char[] 字符数组 的区别就在于中文 char[]可以使用两个字节存储中文