第 1 节String常用方法1
1.bool Contains(String str):判断字符串对象是否包含给定的字符串。
2.bool StartsWith(String str):判断字符串对象是否以给定的字符串开始。
3.bool EndsWith(String str):判断字符串对象是否以给定的字符串结束。
案例:判断网址是否是网址:以http://开头,以.com或者.cn结尾(复合bool判断)
案例:判断是什么操作系统(Contains)
第 2 节String常用方法2
1.int Length:获取字符串的长度属性
2.char ch = s[3];
3.int IndexOf(int ch):返回指定字符在此字符串中第一次出现的索引 (如果找到该字符,则为 value 的从零开始的索引位置;如果未找到,则为 -1。)
4.int IndexOf(String str):返回指定字符串在此字符串中第一次出现的索引
5.LastIndexOf:最后一次出现的位置。
6.String Substring(int start):截取字符串。返回从指定位置开始截取后的字符串。
7.String substring(int start,int length)截取字符串。返回从指定位置开始截取指定长度length的字符串。
案例:获取一个文件名的名称和扩展名部分
[ADS-108]林志玲.avi 获得 ADS-108
练习:从http://www.rupeng.com:8090/a.htm获得域名、端口号
第 3 节String常用方法3
1.String ToLower():把字符串变成小写;String ToUpper():把字符串变成大写
2.String Replace(char oldChar,char newChar):用新的字符去替换指定的旧字符;String 3.Replace(String oldStr,String newStr):用新的字符串去替换指定的旧字符串
4.String trim():去除字符串两端空格, Trim(params char[] trimChars)去掉两端的给定字符。 TrimEnd、 TrimStart
5.String是不可变的,因此上面的操作都是生成新的字符串对象,要用返回值去取新的字符串。
第 4 节String常用方法4
1.String[] Split(...):重载方法很多,字符串按照分隔符切割。案例:把字符串用“,”分割
2. StringSplitOptions.RemoveEmptyEntries 去除空元素
string[] newStr = str.Split(new char[] {' | ' },StringSplitOptions.RemoveEmptyEntries);
案例:给一个全班数学考试成绩的字符串“50, 80,33,58,99, 82”,成绩用逗号分隔,有的成绩中可能有空格,有的地方逗号是英文、有的逗号是中文。统计班级的平均分。
注:需要小数的运算
float avg = sum * 1F / strArray.Length;
第 5 节String常用方法5
1.bool IsNullOrEmpty (string value)指示指定的字符串是 null 还是 System.String.Empty 字符串。 如果 value 参数为 null 或空字符串 (""),则为 true;否则为 false。(等价于:str==null||str.Length<=0)
2.bool Equals(string a, string b) 确定两个指定的 System.String 对象是否具有相同的值。 如果 a 的值与 b 的值相同,则为 true;否则为 false。 如果 a 和 b 均为 null,该方法返回 true。(StringComparison comparisonType 枚举,是否区分大小写)
3.string Join(string separator, params object[] values) 串联对象数组的各个元素,其中在每个元素之间使用指定的分隔符。一个由 values 的元素组成的字符串,这些元素以 separator 字符串分隔。 如果 values 为空数组,则 System.String.Empty方法将返回 。[ string.Join("|",str) ]
第 6 节案例:小冰聊天机器人
e.KeyChar 获得键盘输入
e.KeyChar==’\r’;
换行:‘\n’
txtBox.AppendText(“插入文字”);
播放背景音乐(想深入搜:Com Interop)
http://www.cnblogs.com/linyongqin/articles/4282722.html
引用 Windows Media Player
WMPLib.WindowsMediaPlayer wplayer = new WMPLib.WindowsMediaPlayer();
wplayer.URL = @"F:\1.mp3";
wplayer.controls.play(); //播放
//wplayer.controls.pause(); //暂停
//wplayer.controls.stop(); //停止
第 7 节案例:表白神器
用Timer,设定Interval(每隔多少毫秒调用一次Tick事件)。
设一个100ms执行一次的定时器,从预定义的“全部表白文本”,每次取在当前文本框文本的长度,然后从“全部表白文本”取第“当前文本框文本的长度”个字符插入到TextBox(设定为多行、Append()附加),当输出完毕Timer.Enabled=false停止定时器。
//获取文本长度,确定写入位置
Char ch=str[txtBox.Text.Length];
第 8 节StringBuilder
使用StringBuilder拼接字符串则不会有临时字符串对象的问题:
StringBuilder sb = new StringBuilder();
sb.Append(s1);
sb.AppendLine("hello"); //
自动添加回车
因为Append方法把this返回了,还可以sb.Append(s1).Append(s2).Append(s3); //链式编程
最后使用String s = sb.ToString()一次性生成拼接结果字符串即可
第 9 节可空的int(值类型)
C#中可以用“int?”表示“可空的int”。注意类型转换(把可能为null的int?赋值给一定不为null的int):
int? i1=5; if(i1!=null) { int i= (int)i1; }
等价于
if(i1.HasValue) { int i=i1.Value; }
也可以通过i1.HasValue判断是否为null、i1.Value来获得值。
第 10 节案例:LED时钟
.Net使用DateTime类表示时间数据类型。DateTime属于结构体,因此也是值类型。
除以10得到的余数是个位,除以10得到的商的整数是十位
练习:整点报时
练习:把阿拉数字转换成中文金额数字: 123 -> 壹佰贰拾弎圆
注:char类型的数值转化成int (通过 – ‘0’ 实现)
strJE = strNum[ch - '0'] + strJE;
第 11 节异常的概念和捕获
1.异常的根类为Exception。异常类一般都继承自Exception
throw new Exception(“抛出的异常信息”); //直接抛出异常
2、
try { String s = null; s.ToString(); //一旦try代码块中发生异常,则代码块中异常点之后的代码不会再执行 Console.WriteLine(“如果出现异常,不会被执行到”): } catch (NullReferenceException ex) { //把可能发生异常的代码放到try代码块中 //catch捕获代码块中的NullReferenceException异常 // 如果捕捉到,ex就是代表异常对象 Console.WriteLine("为空"+ex.Message); }
ex就是发生异常的异常类对象,变量名只要不冲突就任意。
3、在异常处理中,一旦try里面有问题了。放弃try代码块中之后的代码,直接跳到catch里面执行。如果try代码后还有代码,则处理完catch后还会继续执行。
第 12 节tryfinally
4、多个异常的处理
try { int a = 10; int b = 0; Console.WriteLine(a / b); int[] arr = { 1, 2, 3 }; Console.WriteLine(arr[3]); } catch (DivideByZeroException ae) { Console.WriteLine("除数不能为0"); } catch (IndexOutOfRangeException ae) { Console.WriteLine("数组越界异常"); } catch(Exception ex) { //捕获所有异常 Console.WriteLine("报错:"+ex.Message); }
可以catch住父类异常,这样就可以抓住所有子类异常了(不推荐)
try{ //有可能有问题代码 }catch(异常类型 异常变量){ //处理方式 }finally{ //无论“有可能有问题代码”是否出错都要执行的代码 }
try之后必须有catch(如果不知道怎么处理,就不要catch)或finally
Finally中一般进行资源的回收等
第 13 节File类
引用命名空间:using System.IO;
File是静态类(无法被new)中的主要静态方法:
1.void Delete(string path):删除文件;
2.bool Exists(string path):判断文件是否存在;
3.string[] ReadAllLines(string path):将文本文件中的内容读取到string数组中;
4.string ReadAllText(string path):将文本文件读取为一个字符串
5.void WriteAllLines(string path, string[] contents):将string[]写入到文件中;
6.void WriteAllText(string path, string contents):将字符串contents写入到文件path中。
7.AppendAllText:向文件中附加内容;Copy复制文件;Move移动文件
注:文件路径 (@ 对 \ 进行转义)
文件编码:Encoding.Default 默认编码(系统)
ReadAllLines、ReadAllText 只能读文本文件
WriteAllLines 写入的编码格式是UTF-8 ( C#默认编码 )
第 14 节Directory类
1.CreateDirectory(string path):创建文件夹全路径
2.void Delete(string path, bool recursive):删除文件夹path, recursive表示是否也删除子文件及子文件夹。如果文件夹不为空, recursive=false,则抛异常;
Directory.Delete(@"D:\temp\redissessiontest", true); //递归删除
3.bool Exists(string path):判断文件夹是否存在
4.EnumerateFiles、 EnumerateDirectories遍历文件和文件夹;
IEnumerable<string> files1 = //Directory.EnumerateFiles(@"d:\temp"); //Directory.EnumerateFiles(@"d:\temp","*.*",SearchOption.AllDirectories); Directory.EnumerateFiles(@"d:\temp", "*.avi", SearchOption.AllDirectories); IEnumerator<string> filesEnum1 = files1.GetEnumerator(); while (filesEnum1.MoveNext())//在结果中向下移动一条 { Console.WriteLine(filesEnum1.Current);//获得当前结果 }
第 15 节FileStream写入
1.Stream fs=new FileStream() 更好,在使用的变量类型提供的操作能满足的前提下,尽可能用父类、接口声明变量
2.Windows换行:\r\n
3.Stream写入的单位是byte(字节),char转换为byte时候,一个英文char转换为一个byte(对应的ASCII码),一个中文char转换为两个byte(*采用GBK编码时),一个中文char转换为3个byte(*采用UTF8编码时)
4.采用Default、UTF8、UTF32得到的字符串的byte[]长度不一样,因此说明不同类型编码在计算机中存储的不一样。用什么编码写入就用什么编码读取,否则会有乱码的问题。
FileStream fs = new FileStream(@"d:\temp\1.txt",FileMode.Create);
byte[] bytes1 = Encoding.Default.GetBytes("如鹏网你好\r\n");
//任何数据都是以byte为单位写入的。GetBytes获得字符串的byte表示形式
fs.Write(bytes1,0,bytes1.Length);
byte[] bytes2 = Encoding.Default.GetBytes("www.rupeng.com");
fs.Write(bytes2,0,bytes2.Length);//在上一个Write的结尾继续写入
fs.Close();//一定要用完了关闭
第 16 节FileStream资源正确的释放Dispose
释放FileStream资源: Try{…} finally{…}
- 定义文件流为null:FileStream fs = null;
- 创建文件流对象:new FileStream
- 将字符编码为一个字节序列: byte[] bytes1 = Encoding.Default.GetBytes(str)
4.进行写入:fs.Write()
5. 文件流不为null,释放资源
FileStream fs = null; //避免来不及创建就出异常,放到try外面finally才能使用fs try { fs =new FileStream(@"F:\myTest.txt", FileMode.Create); byte[] bytes1 = Encoding.Default.GetBytes("FileStream 写入"); fs.Write(bytes1, 0, bytes1.Length); byte[] bytes2 = Encoding.Default.GetBytes("FileStream 写入"); fs.Write(bytes2, 0, bytes2.Length); } finally { if (fs!=null) { fs.Dispose(); } }
第 17 节using简化资源释放
1.using语法,对于实现了 IDisposable接口的对象,可以进行简化
2.同时声明多个资源:
using (MyFile f1 = new MyFile()) using (MyFile f2 = new MyFile()) { }
3.using只是try……finally,如果需要catch,只要catch就是了。
try { using( …. ){ …… } } catch( …. ) { }
第 18 节FileStream读取文件以及乱码问题
using (FileStream fs = new FileStream(@"D:\temp\1.txt", FileMode.Open)) { byte[] bytes = new byte[4]; //fs.Read(bytes, 0, bytes.Length);//每次读取4个字节,下次Read的时候再读取最多4个byte //返回值为真正读取的字节数 int len; //判断是否已经读到了最后 while ((len = fs.Read(bytes, 0, bytes.Length)) > 0) { //把byte数组转化为字符串 string s = Encoding.Default.GetString(bytes, 0, len); Console.WriteLine(s); } }
while
((len = fs.Read(bytes, 0, bytes.Length)) > 0)
继续从流中读取最多
bytes
长度那么多字节的数据拷贝到
bytes
数组中。下次
read
是从上次最后一个
read
最后的位置之后开始读,一次次的读取
read
方法返回这次一共读了多少字节(比如遇到最后一次读取,可能读不满),一旦返回的
=0
了就说明读完了。对于基本数值类型数组,没有被赋值的初始值就是
0
,因为没被填满的数组位置是
0.
字节流不适合读取内容中包含文本文档,容易造成数据错乱(byte[] 中含有一半的汉字 ),要用StreamReader。
第 19 节FileStream实现文件的拷贝
FileStream文件拷贝:
- 打开输出流: Stream inStream
- 创建输入流: Stream outStream
- 创建缓存区: byte[] bytes=new byte[1024*1*24]
- 读取长度大于0进行写入操作: (len = inStream.Read(bytes, 0, bytes.Length)) > 0
跑表(Stopwatch):
- 引用命名空间:System.Diagnostics
- 创建对象:Stopwatch sw = new System.Diagnostics.Stopwatch();
- 计时开始:sw.Start();
- 计时结束:sw.Start();
- 经过毫秒数:sw.ElapsedMilliseconds
//跑表 System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch(); sw.Start(); using(Stream inStream=new FileStream(@"F:\reflector.zip",FileMode.Open)) using (Stream outStream = new FileStream(@"F:\myTest\new.zip", FileMode.Create)) { //缓冲区(buffer)的大小:过小:降低速度;过大:占用内存 byte[] bytes=new byte[1024*1*24]; //1M int len; while ((len = inStream.Read(bytes, 0, bytes.Length)) > 0) { outStream.Write(bytes, 0, len); } } sw.Stop(); Console.WriteLine("拷贝文件所用时间:"+sw.ElapsedMilliseconds+"毫秒");
第 20 节封装Copy流的方法并开发下载器
文件下载器:
1.WebRequest/WebResponse 需要通过引用命名空间 using System.Net;
2.获取网络资源
3.转化成输出
4.转化成输出流
5.创建写入流
namespace 封装Copy流的方法并开发下载器 { class Program { static void Main(string[] args) { //using (Stream inStream = new FileStream(@"F:\reflector.zip", FileMode.Open)) //using (Stream outStream = new FileStream(@"F:\3.zip", FileMode.Create)) //{ // //Copy(inStream, outStream); // inStream.CopyTo(outStream); //} //文件下载器: WebRequest/WebResponse 需要通过引用命名空间 using System.Net; //获取网络资源 WebRequest req=WebRequest.Create("http://www.baidu.com/img/bdlogo.png"); //转化成输出 using (WebResponse res=req.GetResponse()) //转化成输出流 using (Stream inStream=res.GetResponseStream()) //创建写入流 using (Stream outStream = new FileStream(@"F:\baidu.png", FileMode.Create)) { Copy(inStream, outStream); } Console.WriteLine("复制完成"); Console.ReadKey(); } /// <summary> /// 重载Copy方法 /// </summary> /// <param name="inStream"></param> /// <param name="outStream"></param> static void Copy(Stream inStream, Stream outStream) { Copy(inStream, outStream, 1024*1024); } /// <summary> /// 从当前流中读取字节并将其写入到另一流中 /// </summary> /// <param name="inStream">当前流的内容</param> /// <param name="outStream">将复制到的流</param> /// <param name="bufferSize">缓冲区的大小</param> static void Copy(Stream inStream, Stream outStream, int bufferSize) { byte[] bytes = new byte[bufferSize]; int len; while ((len = inStream.Read(bytes, 0, bytes.Length)) > 0) { outStream.Write(bytes, 0, len); } } } }
第 21 节StreamReader和StreamWriter
StreamReader:
- 打开文件流 Stream inStream
- 创建读取流 StreamReader read
- 获取读取流的行 read.ReadLine ,不为空继续向下读取
using (Stream inStream = new FileStream(@"F:\myTest2.txt", FileMode.Open)) using (StreamReader read = new StreamReader(inStream, Encoding.Default)) { string line; while ((line = read.ReadLine()) != null) { Console.WriteLine(line); } }
StreamWriter:
- 创建文件流 Stream outStream
- 创建写入流 StreamWriter sw
- 写入 sw.WriteLine
using (Stream outStream = new FileStream(@"F:\123.txt", FileMode.Create)) using (StreamWriter sw = new StreamWriter(outStream, Encoding.Default)) { sw.Write("你好a哈哈"); sw.WriteLine("hehe"); sw.WriteLine("1111"); }
第 22 节泛型List
1、数组长度是固定的,List<T>可以动态增删内容。List<T>是泛型的,可以在声明的时候指定放什么类型的数据。
List<int> list = new List<int>(); list.Add(1); list.Add(2); list.AddRange(new int[] { 1, 2, 3, 4, 5, 6 }); list.AddRange(list);//另一个list
2、如何遍历?
for (int i = 0; i < list1.Count; i++) { int num = list1[i]; Console.WriteLine(num); }
3、int[] nums = list.ToArray(); //List泛型集合可以转换为数组
List<string> listStr = new List<string>(); string[] str = listStr.ToArray();
4. 数组转换为泛型集合
int[] nums= new int[] { 1, 2, 3, 4, 5, 6 }; List<int> list2 = new List<int>(nums);
第 23 节字典Dictionary
- 创建字典:
Dictionary<TKey, TValue> dict=new Dictionary<TKey, TValue>;
- 往字典里放数据:
(1):dict.Add (TKey key, TValue value); //如果key已经存在,则抛异常
(2):dict[
key] =
value; //
如果不存在
key
,则添加;如果存在则替换
3. 根据key从字典中查数据
string
value = dict[
key];
4. 是否包含指定的键
Dict.
ContainsKey(TKey key);
5. 是否包含特定值
dict.ContainsValue(TValue value);
第 24 节案例:火星文翻译器
- 复制txt文件内容,不要设置“自动换行”
- 如果在字典中没有的汉字,就不翻译
Dict.
ContainsKey(TKey key);
第 25 节ForEach
- 除了使用for遍历,实现了IEumerable接口的对象还可以使用foreach遍历
- List<T>、 Dictionary<K,V> 等一切实现了IEumerable接口的对象都可以
Dictionary<int, string> dict = new Dictionary<int, string>(); dict[1] = "你"; dict[2] = "我"; dict[3] = "我"; dict[4] = "他"; dict[5] = "哈"; foreach (KeyValuePair<int, string> item in dict) { Console.WriteLine(item.Key+"---"+item.Value); } //string searchPattern中“*”用法类是SQL中的“%” IEnumerable<string> files = Directory.EnumerateFiles(@"F:\myTest", "*.*", SearchOption.AllDirectories); foreach (string item in files) { Console.WriteLine(item); }