第五章:.Net常用基本类库

 

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{…}

  1. 定义文件流为null:FileStream fs = null;
  2. 创建文件流对象:new FileStream
  3. 将字符编码为一个字节序列: 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文件拷贝:

  1. 打开输出流: Stream inStream
  2. 创建输入流: Stream outStream
  3. 创建缓存区: byte[] bytes=new byte[1024*1*24]
  4. 读取长度大于0进行写入操作: (len = inStream.Read(bytes, 0, bytes.Length)) > 0

 

跑表(Stopwatch):

  1. 引用命名空间:System.Diagnostics
  2. 创建对象:Stopwatch sw = new System.Diagnostics.Stopwatch();
  3. 计时开始:sw.Start();
  4. 计时结束:sw.Start();
  5. 经过毫秒数: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

  1. 打开文件流 Stream inStream
  2. 创建读取流 StreamReader read
  3. 获取读取流的行 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

  1. 创建文件流 Stream outStream
  2. 创建写入流 StreamWriter sw
  3. 写入 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

 

  1. 创建字典:

Dictionary<TKey, TValue> dict=new Dictionary<TKey, TValue>;

  1. 往字典里放数据:

(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 节案例:火星文翻译器

 

  1. 复制txt文件内容,不要设置“自动换行”
  2. 如果在字典中没有的汉字,就不翻译

Dict. ContainsKey(TKey key);

 

 

第 25 节ForEach

 

  1. 除了使用for遍历,实现了IEumerable接口的对象还可以使用foreach遍历
  2. 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);

            }

 

转载于:https://www.cnblogs.com/linyongqin/articles/4298374.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值