ArrayList 不太好用: 因为集合里面存放的是 Object 类型的元素,会产生装箱和拆箱,影响系统运行
时间
AddRange 添加数组,添加进去之后,在集合里面是以单个元素存放的
装箱:值类型====>引用类型( string 数组 class object 接口)
拆箱:引用类型==>值类型
int n = 10;//值类型
object o = n;//装箱
int n2 = (int)o;//拆箱(装箱用的什么类型,拆箱就要用什么类型,不然要抛异常)
string s = "123";
int n = Convert.ToInt32(s);//引用类型==>值类型,但不是拆箱,装箱拆箱的前提是:两种
类型是否有继承关系
Hashtable(键值对集合)(键 就相当于 数组的下标,但无法使用for循环遍历,要用foreach遍历 )
----- 必须熟练掌握!!
var 能够根据赋值推断出类型,但是声明的时候必须赋初值.
Hashtable h = new Hashtable();
h.Add(1, "asdfa");//添加数据
h.Add(‘男‘, false);
h.Add(178.99, "80KG");
foreach (var item in h.Keys) // h.keys 所有的键
{
Console.WriteLine(h[item]);
}
//键必须是唯一的,值可以重复
h[object key] = (object value)// 赋值 ,key 可以不存在
bool b = h.ContainsKey(object key) //是否包含某个键
bool bb = h.ContainsValue(object value)//是否包含某个值
foreach(迭代遍历): 只能遍历,但不能更改
C#是一门强类型语言:必须对数据的类型有一个明确的定义.
JavaScipt 弱类型语言
//成员变量的作用域大于局部变量
//成员变量可以有访问修饰符,并且有默认的访问修饰符
//局部变量不允许添加访问修饰符,局部变量的作用域就是在当前所在的函数(大括号)
ArrayList 和 Hashtable 都是 非泛型集合
泛型集合: List<T> Dictionary<Tkey,Tvalue> //固定类型 Type
ArrayList 和 List<T> 可以通过下标遍历
Hashtable 和 Dictionary<Tkey,Tvalue> 只能通过 foreach 遍历
list.RemoveAll(n => n.Length == 3);//去掉所有长度等于3的字符串
对于Dictionary<Tkey,Tvalue> 可以使用一种比较洋气的遍历方式
d.Add(1, "张山");
d.Add(2, "李四");
d[3] = "网吧";
foreach (KeyValuePair<int,string> kv in d)
{
Console.WriteLine(kv);//也可以写成
//Console.WriteLine("键是{0},值是
{1}",kv.Key,kv.Value);
}
显示结果为:
[1,张山]
[2,李四]
[3,网吧]
Path:
string p = @"C:\Users\Administrator\Desktop\1.TXT";
///获取文件名
string s = Path.GetFileName(p);
Console.WriteLine(s);
//获取文件名,不含扩展名
Console.WriteLine(Path.GetFileNameWithoutExtension(p));
//获取文件所在的文件夹的路径
Console.WriteLine(Path.GetDirectoryName(p));
//改变文件的扩展名
Console.WriteLine(Path.ChangeExtension(p,".jpg"));
//将多个路径连接成一个路径,"\"要放在前一个路径的结尾.而不能放到后一个路径的开
头.
Console.WriteLine(Path.Combine(@"c:\a\b\",@"c\d\e\",@"f.txt"));
Console.WriteLine(Path.GetFileName(p));
Console.WriteLine(Path.GetFileNameWithoutExtension(p));
//通过相对路径来返回绝对路径(可以直接在电脑中找到的路径)
//相对路径:文件相对于应用程序的路径
// E:\C#练习\面向对象\20170627\PATH\bin\Debug\1123.txt
string p2 = "1123.txt";
Console.WriteLine(Path.GetFullPath(p2));
File类: 一般操作小文件!!几十M的文件(读大文件用文件流)
//如果文件不存在就创建
if (!File.Exists("1.txt"))
{
File.Create("1.txt");
Console.WriteLine("创建成功!");
}
//如果文件存在则删除后再创建
else
{
File.Delete("1.txt");
File.Create("2.txt");
Console.WriteLine("2.txt创建成功");
}
//第一个参数是源文件的路径
//第二个参数是目标文件的路径
//第三个参数表示,如果目标文件存在,则覆盖(该参数可以没有)
File.Copy("2.txt", @"C:\Users\Administrator\Desktop\22.txt", true);
//剪切
File.Move(@"C:\Users\Administrator\Desktop\22.txt", @"E:\C#练习\面向对象
\20170627\File类\bin\Debug\33.TXT");
编码:将字符串以怎样的形式保存为二进制
出现的乱码的原因:保存这个文件所采用的编码跟打开这个文件所采用的编码不一样
//File.ReadAllBytes();可以读取所有的文件
//File.ReadAllLines(string path);
//File.ReadAllText(string path);
//这两个文件只能读取文本文件
//文本文件:如果拖到txt中还能看得懂,那么就是文本文件
//默认用UTF-8格式读取文件所有行,因此要加上Encoding.Default获取当前操作系统默
认的编码
//返回值是 一个是string 一个是string[]
//如果要对每一行进行操作,用ReadAllLines
string str = File.ReadAllText(@"C: \Users\Administrator\Desktop\1.txt",
Encoding.Default);
string[] s = File.ReadAllLines(@"C: \Users\Administrator\Desktop\1.txt",
Encoding.Default);
byte[] b = File.ReadAllBytes(@"C: \Users\Administrator\Desktop\1.txt");
string s1 = Encoding.Default.GetString(b);
//写入文件,都是覆盖写入,会将之前的覆盖掉
string s2 = "几天天asdfasdf真整的很好呀啊a呀呀呀ldfjgop8374592!";
string[] s3 = { "最佳哈买那个萨满", "阿什顿了解放啦", "大家垃圾" };
byte[] b1 = Encoding.Default.GetBytes(s2);
File.WriteAllBytes(@"234.txt",b1);
File.WriteAllText(@"aaa.txt", s2);
File.WriteAllLines(@"mm.txt",s3);