第 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()
- 文件流不为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[1024124]
读取长度大于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
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[] str = listStr.ToArray();
- 数组转换为泛型集合
int[] nums= new int[] { 1, 2, 3, 4, 5, 6 };
List
第 23 节 字典Dictionary
创建字典:
Dictionary<TKey, TValue> dict=new Dictionary<TKey, TValue>;
往字典里放数据:
(1):dict.Add (TKey key, TValue value); //如果key已经存在,则抛异常
(2):dict[key] = value; //如果不存在key,则添加;如果存在则替换
- 根据key从字典中查数据
string value= dict[key];
- 是否包含指定的键
Dict. ContainsKey(TKey key);
- 是否包含特定值
dict.ContainsValue(TValue value);
第 24 节 案例:火星文翻译器
复制txt文件内容,不要设置“自动换行”
如果在字典中没有的汉字,就不翻译
Dict. ContainsKey(TKey key);
第 25 节 ForEach
除了使用for遍历,实现了IEumerable接口的对象还可以使用foreach遍历
List
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);
}
评论区