列表
列表很像数组,但列表的优势是,列表的容量是自动增加的,但相对而言,列表的开销也会比数组大
初始化列表
List<int> list = new List<int>() { 11, 3, 2,3,11 };// 容量,元素个数
列表 相当于是一个动态的存储空间,内存空间会根据元素的个数进行扩展 如果元素的个数为0,那么分配的容量就是0,如果小于等于4就是4,大于4小于8就是8,以后会翻倍扩展(4,8,16,32....
List<int> list = new List<int>() { 11, 3, 2,3,11 };// 容量,元素个数
Console.WriteLine(list.Count);
Console.WriteLine(list.Capacity);
foreach (int i in list)
{
Console.Write(i);
}
Console.WriteLine();
列表的一些操作
list.Add(13);//往列表的最后一个元素后面添加新的值
list.Insert(1, 0);//在指定下标位置插入元素
list.Remove(11);//删除第一个找到的值
list.RemoveAt(list.Count - 1);//删除指定下标位置的元素
Console.WriteLine("下标位置"+list.IndexOf(11));//查找指定的元素,返回第一个下标的位置,没有就返回-1
Console.WriteLine("下标位置"+list.LastIndexOf(11));//逆序查找
list.AddRange(list2);//将list2添加到list中,会改变原来的列表
list.RemoveRange(3, 3);//删除的起始下标位置,删除元素个数
字典
字典中存放的是一组组键值对
初始化字典
Dictionary<string, string> dict = new Dictionary<string, string>()
{
{"name","马里奥" },{"name","路易吉"}
};
dict.Add("name", "桃花");//向字典中添加
Console.WriteLine(dict["name"]);//通过键名读取字典中的值
//遍历字典中的值
foreach(KeyValuePair<string, string> kvp in dict)
{
Console.WriteLine(kvp.Key + kvp.Value);//获取键值对
}
foreach(string key in dict.Keys)//拿到字典中所有的键名
{
Console.WriteLine(key);
}
foreach(string value in dict.Values)//拿到字典中所有的值
{
Console.WriteLine(value);
}
Console.WriteLine(dict.ContainsKey("name"));//可以判断字典中是否有对应的键名,返回bool值
Console.WriteLine(dict.ContainsValue("小花"));//可以判断字典中是否有对应的值,返回bool值
合并俩个字典
Dictionary<string, string> dict2 = new Dictionary<string, string>();
Dictionary<string, string> dict3 = new Dictionary<string, string>();
dict2.Add("name", "xiaoming");
dict2.Add("id", "12312312");
dict3.Add("lll", "bog");
dict3.Add("hai", "xiaoming");
dict3.Add("hello", "xiaoming");
dict2 = dict2.Concat(dict3).ToDictionary(x => x.Key, y => y.Value);
foreach (string k in dict2.Keys)
{
Console.WriteLine(k);
}
将一个数组中的奇数放到一个集合中,再将偶数放到另一个集合中,最终将两个集合合并为一个集合,并且奇数显示在左边,偶数显示在右边
int[] ints = { 1, 3, 2, 1, 5, 3, 5, 6 };
List<int> ints1 = new List<int>();
List<int> ints2 = new List<int>();
for (int i = 0; i < ints.Length; i++)
{
if (ints[i]%2==0)
{
ints1.Add(ints[i]);
}
else
{
ints2.Add(ints[i]);
}
}
ints1.AddRange(ints2);
使用字典的方式,计算出任意字符串中,每个字符出现的次数
string str1 = "maddfsaflasfj0";
Dictionary<char,int> dit3 = new Dictionary<char,int>();
foreach(char c in ints1)
{
if (dit3.ContainsKey(c))
{
dit3[c]++;
}
else
{
dit3.Add(c, 1);
}
}
foreach(KeyValuePair<char,int> kvp in dit3)
{
Console.WriteLine("字符"+kvp.Key +"出现"+ kvp.Value);
}
大文件操作
file只能一次性读取文件信息, 读取大文件信息用FileStream类
//读取的是字节,转成字符串 Encoding
FileStream fsRead=new FileStream("./1.txt",FileMode.OpenOrCreate,FileAccess.Read);
byte[] buffer=new byte[1024*1024*5];//最大读取的信息是5M
//获取实际读取的字节数
int fsNum =fsRead.Read(buffer);//开始读取字节信息
//获取到的字节信息是不是要转成字符串,3个字节对应一个中文字符,一个字节对应8位二进制数
string fStr=Encoding.UTF8.GetString(buffer,0,fsNum);
Console.WriteLine(fStr);
//关闭文件通道,释放所占的资源
fsRead.Close();
fsRead.Dispose();
//往文件中写入信息
using (FileStream fsWrite = new FileStream("./1.txt", FileMode.OpenOrCreate, FileAccess.Write))
{
//写入内容 必须是字节
string str = "asfasd";
byte[] buffer2 = Encoding.UTF8.GetBytes(str);
fsWrite.Write(buffer2,0,buffer2.Length);
}
FileStream可以读取所有的文件,包括图片,音频等等,写法比较麻烦。 读取大文件的非图片,音频信息,我们就可以使用StreamReader,StreamWriter(字符串)
StreamReader sRead =new StreamReader("./1.txt",Encoding.UTF8);
string RString = sRead.ReadToEnd(); //读取所有的信息
Console.WriteLine(RString);
string RArray1 = sRead.ReadLine(); //逐行读取信息,每次读取一行
string RArray2 = sRead.ReadLine(); //逐行读取信息,每次读取一行
Console.WriteLine(RArray1);
Console.WriteLine(RArray2);
char R =(char)sRead.Read();//读取每个字符
Console.WriteLine(R);
sRead.Close();
//写入
StreamWriter fsWrite2 = new StreamWriter("./1.TXT",true);//true表示,是否使用追加的形式
fsWrite2.WriteLine("DAFAJSDKA");//换行
fsWrite2.Write("DAFAJSDKA");
fsWrite2.Write("DAFAJSDKA");
fsWrite2.Close();//如果没有close就会认为你还没有结束写的操作
三种读取文件方法的对比
string fsStr = File.ReadAllText("./1.txt");//读出来字符串
FileStream fsRead=new FileStream("./1.txt",FileMode.OpenOrCreate,FileAccess.Read);/读出来字节
StreamReader fsRead =new StreamReader("./1.txt",Encoding.UTF8);//读出来字符串
从文件2.txt中读取到每一行的信息,把每一行中含有财大的一行信息存放到3.txt中
//从文件2.txt中读取到每一行的信息,把每一行中含有财大的一行信息存放到3.txt中
StreamReader fsRead3 = new StreamReader("./2.txt");
StreamWriter fsWrite3 = new StreamWriter("./3.txt",true);
string s1 = fsRead3.ReadToEnd();
string[] sArray = s1.Split("\n");
foreach(string s in sArray)
{
if (s.Contains("财大"))
{
fsWrite3.WriteLine(s);
}
}
//或者使用正则
string pattern = @"财.*大";
foreach (string s in sArray)
{
if (Regex.IsMatch(s, pattern))
{
fsWrite3.WriteLine(s);
}
}
fsWrite3.Close();
fsRead3.Close();