Encoding类的几种方法(File用到)
- unicode 由utf7、utf8、utf32(三种国际标准组合而成)
- (Encoding.Default是ANSI)
出现乱码了,尝试顺序 Default-utf8-Encoding.GetEncoding("GB2312")-Encoding.GetEncoding("GBK")
出现乱码的原因:保存和打开的编码方式不一致
GB2312:只有简体
GBK:简体繁体都包含
File类
File提供三种方式读取
1.File.ReadAllBytes 除string类型外,还可以读取多媒体文件,图片文件等,因为所有的数据其实都是以字节行式存储的
2.File.ReadAllLines 只能读取string类型,返回字符串数组(用foreach读取),因此可以精确操作每一行
3.File.ReadAllTexts 只能读取string类型,返回字符串绝对路径和相对路径
绝对路径:通过这个路径直接能在我的电脑中找到这个文件
相对路径:文件相对于应用程序的路径(使用时直接写在此路径下的文件名即可)
编程时最好使用相对路径,具有更好的可移植性
File提供三种方式写入(写入会覆盖):
1.File.WriteAllBytes
2.File.WriteAllLines 要写入字符串数组
3.File.WriteAllTexts 要写入字符串File写入不覆盖,提供三种方式:
1.File.AppendText
2.File.AppendAllText
3.File.AppendAllLinesFile类的缺点:只能读取小文件,因为他要一下子全部读取进来,读的过程耗费内存,读大文件需要用文件流;
List泛型集合
- ArrayList的问题:ArrayList里面的数据都是object类型,因此取出来的时候也是object类型,无法直接使用(需要转成对应的你需要的类型)
- 解决方式:使用List泛型集合
-
List泛型集合同数组一样,有确切的类型(List泛型集合可以转化为数组)
List的Add();方法 - List泛型与ArrayList一样拥有
Add();
AddRange();
Remove();
RemoveAt();
RemoveDange();
Reverse();
Sort();
Insert();
InsertRange();
等方法; - List泛型集合可以转化为数组,使用List.ToArray();方法
数组也可以转List,使用nums.ToList();
装箱和拆箱
为什么不用ArrayList和Hashtable了?
装箱:把值类型转化成引用类型
拆箱:把引用类型转化成值类型
因此代码中应该尽量避免装箱和拆箱
- 看两种类型是否装箱或拆箱,要看两种类型是否有继承关系。有继承关系才有可能有装箱拆箱,否则没有。
键值对集合Dictionary对应Hashtable
- 键和值的类型都是确定的(声明的时候确定)
- 与Hashtable的不同
dictionary的类型固定,键和值的类型可以是int,float,string等,但是固定不变
Dictionary<string, float> dic = new Dictionary<string, float>();
Hashtable的类型不固定,不固定的意思是同一个hashtable种可以插入的键和值不同,比如可以插入(1,"张三")和(false,1)等类型不同的键值对
Hashtable ht = new Hashtable();
-
Dictionary遍历的洋气用法
洋气用法与原方法比较
习题
- 练习一
将一个数组中的奇数放到一个集合中,偶数放到另一个集合中
最终将两个集合合并为一个集合,且奇数显示在左边,偶数显示在右边
namespace 泛型练习
{
class Program
{
static void Main(string[] args)
{
//将一个数组中的奇数放到一个集合中,偶数放到另一个集合中
//最终将两个集合合并为一个集合,且奇数显示在左边,偶数显示在右边
int[] s = {1,2,3,4,5,6,7,8,9,10,99,100,110,112,114};
List<int> listji = new List<int>();
List<int> listou = new List<int>();
for (int i = 0; i < s.Length; i++)
{
if (s[i] % 2 == 0)
{
listou.Add(s[i]);
}
else
{
listji.Add(s[i]);
}
}
listji.AddRange(listou);
foreach (var item in listji)
{
Console.Write(item+" ");
}
Console.ReadKey();
}
}
}
自己写的代码的效果
//将一个数组中的奇数放到一个集合中,偶数放到另一个集合中
//最终将两个集合合并为一个集合,且奇数显示在左边,偶数显示在右边
int[] s = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 99, 100, 110, 112, 114 };
Hashtable OddHt = new Hashtable();
Hashtable EvenHt = new Hashtable();
for (int i = 0; i < s.Length; i++)
{
if (s[i] % 2 == 0)
{
EvenHt.Add(i, s[i]);
}
else
{
OddHt.Add(i, s[i]);
}
}
foreach (var item in OddHt)
{
Console.WriteLine("{0}-----{1}", item, OddHt[item]);
}
foreach (var item in EvenHt)
{
Console.WriteLine("{0}-----{1}", item, EvenHt[item]);
}
Console.ReadKey();
- 练习二
#region 练习二
//提示用户输入一个字符串,通过foreach循环将用户输入的字符串赋值给一个字符数组
Console.WriteLine("请输入一个字符串");
string input = Console.ReadLine();
char[] chs = new char[input.Length];
int i = 0;
foreach (char item in input)
{
chs[i] = item;
Console.WriteLine(chs[i]);
i++;//(更正)不写也能正确输出,但是只有下标为0的数组位置存了最后一个字符
}
#endregion
- 练习三
#region 练习三
//统计welcome to china中每个字符出现的次数 不考虑大小写
//思路:字母是键,对应的出现次数是值
Dictionary<char, int> dic = new Dictionary<char, int>();
string s = "wElcome to China";
//不考虑大小写
s = s.ToLower();
for (int i = 0; i < s.Length; i++)
{
//消除空格
if(s[i] == ' ')
{
continue;
}
if (dic.ContainsKey(s[i]))
{
dic[s[i]]++;
}
else
{
dic[s[i]] = 1;
}
}
foreach (KeyValuePair<char,int> kv in dic)
{
Console.WriteLine("{0}----{1}", kv.Key, kv.Value);
}
Console.ReadKey();
#endregion