复习

Person类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace _01人员信息作业
{
public class Person
{
public string Name { get; set; }
public int Age { get; set; } public override string ToString()
{
return this.Name;
}
}
}

主程序:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO; namespace _01人员信息作业
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void button1_Click(object sender, EventArgs e)
{
//0.采集数据
string name = txtName.Text.Trim();
int age = Convert.ToInt32(txtAge.Text.Trim()); //1.把采集到的数据保存到文本文件中
//创建一个写入文本文件的文件流
using (StreamWriter writer = new StreamWriter("renyuan.txt", true))
{
//执行追加
writer.WriteLine(string.Format("{0},{1}",name,age));
} ////2.把采集到的数据的姓名,显示到ListBox中
//listBox1.Items.Add(name);
Person p = new Person();
p.Name = name;
p.Age = age;
listBox1.Items.Add(p);
} //窗体加载的时候读取renyuan.txt文本文件,将其加载到ListBox中
private void Form1_Load(object sender, EventArgs e)
{
//1.读取文件
using(StreamReader reader=new StreamReader("renyuan.txt",Encoding.UTF8))
{
//循环读取每一行
string line = null;
while ((line=reader.ReadLine())!=null)
{
string[] parts = line.Split(','); ////只把人员的姓名增加到ListBox中
//listBox1.Items.Add(parts[0]); //把每个人的对象(这个人的基本信息),增加到ListBox中的某个Item中
Person p =new Person();
p.Name = parts[];
p.Age = Convert.ToInt32(parts[]);
listBox1.Items.Add(p); }
}
//2.每读取一行就加载到ListBox中一行
} //ListBox的Item选择项被改变的事件
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
Person p = listBox1.SelectedItem as Person;
if (p!=null)
{
txtName.Text = p.Name;
txtAge.Text = p.Age.ToString();
}
}
}
}

压缩和解压:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.IO.Compression; namespace _02压缩与解压
{
class Program
{ static void Main(string[] args)
{
#region 压缩
//string source = "1.txt";
//string target = "yasuo";
//Compress(source,target);
#endregion #region 解压
string source = "yasuo";
string target = "2.txt";
DeCompress(source, target);
#endregion Console.WriteLine("OK");
Console.ReadKey();
} private static void Compress(string source, string target)
{ //1.读取源文件,读取的源文件是未经压缩的
using(FileStream fsRead=File.OpenRead(source))
{
//2.要将读取到的内容压缩,就是要写入一个新的文件
//所以要创建一个新的写入文件的文件流
using(FileStream fsWrite=File.OpenWrite(target))
{
//3.因为在写入的时候要压缩后写入,所以在写入的时候,需要使用一个压缩流来写入
//所以要创建一个压缩流
using (GZipStream zip = new GZipStream(fsWrite,CompressionMode.Compress))
{
//循环读取,每次读取一部分,写入(压缩写入)一部分
byte[] buffers=new byte[*];
int bytecount=fsRead.Read(buffers,,buffers.Length);
while (bytecount>)
{
//写入,用压缩流来写入,这样写入的才是压缩后的
zip.Write(buffers,,bytecount);
bytecount = fsRead.Read(buffers, , buffers.Length);
}
}
}
}
} private static void DeCompress(string source, string target)
{
//先调用FileStream读取,读取到的就是压缩后的文件
using (FileStream fsRead = File.OpenRead(source))
{ //所以要创建一个压缩流,根据fsRead将内容解压
//本来用fsRead读取到的内容是压缩文件,但是通过zip,再读取到的内容就是解压后的内容
using (GZipStream zip = new GZipStream(fsRead, CompressionMode.Decompress))
{ //要解压写到一个新文件中,所以需要一个写入文件的文件流
//创建一个写入文件的文件流
using (FileStream fsWrite = File.OpenWrite(target))
{
//3.对于这个写入流fsWrite来说,只知道把拿到的内容直接写入磁盘,并不关心是什么内容 byte[] buffers = new byte[ * ];
//注意:读取的时候是通过压缩流来读取,这样读取到的才是解压后的内容
int bytecount = zip.Read(buffers, , buffers.Length);
while (bytecount > )
{
fsWrite.Write(buffers,,bytecount);
bytecount = zip.Read(buffers, , buffers.Length);
}
}
}
}
} }
}

序列化1--就是把一个对象转化成一种格式的过程,转换成不同的格式就叫做不同的序列化,比如xml格式,叫做xml序列化。JavaScript 的json格式叫做JavaScript序列化,

二进制byte[]字节叫做二进制序列化。

序列化只序列化那些属性(或者说是序列化了对象中的状态信息,(字段,属性)),方法没有被序列化。

序列化后的目的,是为了把数据以另外一种格式来表示,方便存储与数据交换,所以序列化只序列化那些存储数据的成员,一般就是属性,不会序列化方法的。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.Script.Serialization;
using System.IO;
using System.Xml.Serialization;
using System.Runtime.Serialization.Formatters.Binary; namespace _03对象序列化
{
class Program
{
static void Main(string[] args)
{
#region 对象序列化
//===============================================
List<Person> list = new List<Person>();
list.Add(new Person() { Name="叶长种",Age=,Email="826217795@qq.com"});
list.Add(new Person() { Name = "科比", Age = , Email = "826217795@qq.com" });
list.Add(new Person() { Name = "詹姆斯", Age = , Email = "826217795@qq.com" }); ////使用JavaScript序列化。
//JavaScriptSerializer jsSerializer = new JavaScriptSerializer();
//string str=jsSerializer.Serialize(list);
//File.WriteAllText("list.txt",str);
//Console.WriteLine(str);
//Console.ReadKey(); ////使用xml序列化。
////XmlSerializer xmlSerializer = new XmlSerializer(list.GetType());
//XmlSerializer xmlSerializer = new XmlSerializer(typeof(List<Person>));
//using(FileStream fsWrite=File.OpenWrite("list.xml"))
//{
// xmlSerializer.Serialize(fsWrite, list);
//}
//Console.WriteLine("OK");
//Console.ReadKey(); //二进制序列化。
BinaryFormatter bf = new BinaryFormatter();
using (FileStream fsWrite = File.OpenWrite("list.bin"))
{
bf.Serialize(fsWrite, list);
}
Console.WriteLine("OK");
Console.ReadKey(); #endregion }
} //二进制序列化需要加入[Serializable]
[Serializable]
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public string Email { get; set; }
public void SayHi()
{
Console.WriteLine("大家好,我叫:{0}",Name);
}
public void SayHello()
{
Console.WriteLine("Hello");
}
}
}

二进制序列化:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Threading.Tasks;
using System.IO; namespace _04二进制序列化
{
class Program
{
static void Main(string[] args)
{ Person person = new Person();
person.Name = "叶长种";
person.Age = ;
person.Email = "826217795@qq.com";
person.MyCar = new Car() {Brand="时风" }; #region
//二进制序列化步骤:
//1.创建二进制序列化器
BinaryFormatter bf = new BinaryFormatter();
//我们希望将对象序列化到一个文件上,所以要创建一个文件流
using (FileStream fsWrite = File.OpenWrite("person.bin"))
{
//2.开始执行序列化
bf.Serialize(fsWrite, person);
}
Console.WriteLine("序列化完毕!");
Console.ReadKey(); #endregion
}
} [Serializable]
class Amimal
{ }
[Serializable]
class Car
{
private string _brand; public string Brand
{
get { return _brand; }
set { _brand = value; }
}
} //二进制序列化需要加入[Serializable]
//二进制序列化会把属性对应的字段序列化到文件中,所以最好类型不要使用自动属性(编译器自动生成字段)而要自己写属性和字段
//当序列化一个对象的时候,这个对象的类以及所有父类都必须标记为可序列化的
//类型中所有属性与字段的类型必须也标记为可序列化的。接口和方法有关的,不用标记。
[Serializable]
public class Person:Amimal
{
private Car _myCar; internal Car MyCar
{
get { return _myCar; }
set { _myCar = value; }
}
private string _name; public string Name
{
get { return _name; }
set { _name = value; }
}
private int _age; public int Age
{
get { return _age; }
set { _age = value; }
}
private string _email; public string Email
{
get { return _email; }
set { _email = value; }
} private string _gender = "男"; public int _height = ;
public void SayHi()
{
Console.WriteLine("大家好,我叫:{0}", Name);
}
public void SayHello()
{
Console.WriteLine("Hello");
}
}
}

序列化2

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.IO;
using _04二进制序列化; namespace _05反序列化
{
class Program
{
static void Main(string[] args)
{ #region BinaryFormatter bf = new BinaryFormatter(); using (FileStream fsRead = File.OpenRead("person.bin"))
{
//反序列化的时候,需要创建原来被序列化的类型的对象,所以反序列化 的时候需要引用被序列化的类型的对象。
//正因为如此,所以在二进制序列化的时候,那些属性名,方法等根本不需要序列化,只需要把那些状态信息(数据-字段)的值序列化就好了,
//对于那些方法等信息,在反序列化时,创建对象的时候会自动创建,然后根据序列化文件中的字段的值进行赋值,这就是反序列化
Object obj = bf.Deserialize(fsRead);
Person p = obj as Person;
Console.WriteLine(obj.ToString());
Console.WriteLine(p._height + " " + p.Name + " " + p.Email + " " + p.Age);
}
Console.WriteLine("OK!");
Console.ReadKey(); #endregion
}
}
}

效果图:

正则表达式元符号

. 表示除\n之外的任意的单个字符

a.b
a,b

b..g
baxg
baag
=========================================
[] 字符的筛选

a[axj]b

aab
axb
ajb
abb

axb

a[0123456789]b
a10b
a1b
a0b
axb

a[0123456789abcdfe....z]b
a[0-9]b
a[a-z]b

a[0-9a-zA-Z]b
a1b
axb
aAb

a[^0-9]b 表示a与b之间只能出现除了0123456789之外的任意单个字符。

a[^0-9a-z]b

x[aeiou]y

=====================================================
| 表示或的意思

z|food 由于| 的优先级非常低,所以这个表达式可以匹配 z 或 food

这个表达式不匹配zood

(z|f)ood 才表示zood或者food

z
food
zood

===========================================
()改变运算的优先级。

提取组。

=======================================
* 限定符,表示前面的表达式出现0次或多次。

zoo*

a.*b
ab
aaddddb
afjdsklf%$#@dsklfjdsklfjdsklfjb

a.b

axb
a_b
a.b

.
[]
|
()
*

zoo*
zoooooooooooooooooooooooooooooooooooooooo
zoo
zo
(zoo)*
zoozoo
================================================
+ 限定符,表示前边的表达式必须出现1次或者多次。至少得出现1次。

a.+b
a9dfjsakl3824urnj324239feb
==================================================
? 限定符,表示前边的表达式必须出现0次或者1次。

a.?b
ab
axb
agdsafdsafdab不匹配

? 的另外一个作用就是“终止贪婪模式”。正则表达式默认是贪婪模式。

======================================================================
a[0-9]+b
axb不匹配
ab不匹配
a0b
a00b
a09b
a99999999999999999999b

==========================其他限定符=====================
{n} 限定符,限定前边的表达式必须出现n次。
a[0-9]{10}b
a1234567899b
======================
{n,} 限定符,限定前边的表达式至少出现n次。

1[a-z]{3,}2
1axffdsafdsafdasfdsafdsafdsafdsfdsafsdfdsfdsfdsa2

========================================
{n,m} 限定符,限定前边的表达式至少出现n次,最多出现m次。

a[0-9]{3,7}b
a0000000b

===========================================
.
[]
[^]
|
()
*
+
?
{n}

{n,}
{n,m}

=================================================
^表示的是字符串的开头

$表示字符串的结尾。

^ 和 $ 就表示的是字符串的两个特征。一个表示开头的特征,一个表示结尾的特征

abcxyz

^abc.*xyz$

^abcdefg$

^abcdefg
acxbc

abcfdsafdsafdsafdasfdasfdasfds

fdsfdsfxyz
xyz$

===========================================
a[0-9]b
a\db

\d等价于[0-9]
digital

\D [^0-9]

\s 表示所有那些空白符,不可见字符
a\s*b
ab
a   

b

\S 就是除了\s以外的所有字符。

=================================================
\w [0-9a-zA-Z_]
word表示单词字符。

\W 就是除了\w之外的所有其他字符。

\b表示单词的边界。 (断言,只判断,不匹配。)

============================================

.

下面这几种方式就可以表示任意的单个字符出现在ab之间。
a[\s\S]b
a[\d\D]b
a[\w\W]b

正则表达式测试工具  http://tool.oschina.net/regex#

正则表达式练习:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Text.RegularExpressions; namespace _06正则表达式
{
class Program
{
static void Main(string[] args)
{
//1.正则表达式是对字符串的操作 //2.正则表达式是一个用来描述字符串特征的表达式。
//特征:必须出现的内容,可能出现的内容,不能出现的内容 //观察字符串规律,根据规律总结特征,然后根据特定字符串的特征来编写正则表达式。 #region >10 and <=20的所有字符串 //while (true)
//{
// Console.WriteLine("请输入");
// int n = Convert.ToInt32(Console.ReadLine());
// if (n > 10 && n <=20)
// {
// Console.WriteLine("OK");
// }
// else
// {
// Console.WriteLine("输入不合法!!");
// }
//} //Regex.IsMatch();//判断是否匹配
//Regex.Match();//提取某个(一个)匹配
//Regex.Matches();//提取所有的匹配
//Regex.Replace();//替换
//Regex.Split();//分割 ////1.写正则表达式,观察字符串找规律,根据规律写正则
//while (true)
//{
// Console.WriteLine("请输入");
// string msg=Console.ReadLine();
// bool b = Regex.IsMatch(msg,"^(1[1-9]|20)$");
// Console.WriteLine(b);
//} #endregion #region 正则案例 //while (true)
//{
// Console.WriteLine("请输入");
// string msg = Console.ReadLine();
// //IsMatch()这个函数验证指定的字符串是否匹配指定的正则表达式,但是注意;
// //默认情况下,如果在整个字符串中只要有一部分匹配给定的字符串则返回True
// //bool b = Regex.IsMatch(msg, "[1-9]{6}"); // //要想验证完全匹配6位数字,则必须在正则表达式两端加开始^和结束$
// bool b = Regex.IsMatch(msg, "^[1-9]{6}$");
// Console.WriteLine(b);
//} //while (true)
//{
// Console.WriteLine("请输入");
// string msg = Console.ReadLine();
// //1.这个表达式本身只匹配z或者food
// //2.但是由于正则表达式两端没有加开始^和结束$,
// //所以整个给定字符串只要任何一部分与字符串z或者food匹配,就返回true
// bool b = Regex.IsMatch(msg, "z|food");
// Console.WriteLine(b);
//} //while (true)
//{
// Console.WriteLine("请输入");
// string msg = Console.ReadLine();
// //因为这个正则表达式使用了 | 字符,所以该正则表达式的意思是:^z 或 food$
// //既:所有以z开头的字符串或以food结尾的字符串
// bool b = Regex.IsMatch(msg, "^z|food$");
// Console.WriteLine(b);
//} //while (true)
//{
// Console.WriteLine("请输入");
// string msg = Console.ReadLine();
// //这个只能匹配 字母z 或者 单词 food
// //bool b = Regex.IsMatch(msg, "^(z|food)$");
// bool b = Regex.IsMatch(msg, "(^z$)|(^food$)");
// Console.WriteLine(b);
//} //while (true)
//{
// Console.WriteLine("请输入邮政编码");
// string postcode = Console.ReadLine();
// //bool b = Regex.IsMatch(postcode, "^[0-9]{6}$");
// //bool b = Regex.IsMatch(postcode, "^\\d{6}$");
// //默认.net采用的是unicode字符匹配,所以中文的123456也是匹配的
// //bool b = Regex.IsMatch(postcode, @"^\d{6}$"); // //指定RegexOptions.ECMAScript选项后,\d就只表示普通的数字,不再包含全角的数字
// bool b = Regex.IsMatch(postcode, @"^\d{6}$",RegexOptions.ECMAScript);
// Console.WriteLine(b);
//} //while (true)
//{
// Console.WriteLine("请输入身份证号");
// string id = Console.ReadLine();
// bool b = Regex.IsMatch(id, "^([0-9]{15}|[0-9]{17}[0-9xX])$");
// Console.WriteLine(b);
//} //while (true)
//{
// Console.WriteLine("请输入电话号码");
// string phoneNumber = Console.ReadLine();
// bool b = Regex.IsMatch(phoneNumber, @"^((\d{3,4}\-?\d{7,8})|\d{5})$");
// Console.WriteLine(b);
//} //while (true)
//{
// Console.WriteLine("请输入邮件地址");
// string email = Console.ReadLine();
// //.出现在[]中,就表示一个普通的.可以不转义
// //-出现在[]中第一个位置的时候可以不转义
// bool b = Regex.IsMatch(email, @"^[-a-zA-Z0-9._]+@[-a-zA-Z0-9]+(\.[a-zA-Z0-9]+){1,}$");
// Console.WriteLine(b);
//} #endregion }
}
}

09---Net基础加强的更多相关文章

  1. 09: python基础补充

    1.1 闭包 1.闭包概念 1. 在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用,这样就构成了一个闭包 2. 一般情况下,在我们认知当中,如果一个函数 ...

  2. 09 mongoDB基础(进阶)

    mongoDB基础 阶段一.认识mongodb 1.mongodb 组织数据的基本形式 MongoDB————>数据库————>集合————>文档 mysql:表:行和列:字段 运用 ...

  3. C#3.0新增功能09 LINQ 基础01 语言集成查询

    连载目录    [已更新最新开发文章,点击查看详细] 语言集成查询 (LINQ) 是一系列直接将查询功能集成到 C# 语言的技术统称. 数据查询历来都表示为简单的字符串,没有编译时类型检查或 Inte ...

  4. C#3.0新增功能09 LINQ 基础07 LINQ 中的查询语法和方法语法

    连载目录    [已更新最新开发文章,点击查看详细] 介绍性的语言集成查询 (LINQ) 文档中的大多数查询是使用 LINQ 声明性查询语法编写的.但是在编译代码时,查询语法必须转换为针对 .NET ...

  5. Day 09 函数基础

    函数初级 简介 # 函数是一系列代码的集合,用来完成某项特定的功能 优点 '''1. 避免代码的冗余2. 让程序代码结构更加清晰3. 让代码具有复用性,便于维护''' 函数四部分 '''1. 函数名: ...

  6. docker-ce-17.09 网络基础配置

    一.端口映射实现访问容器 1.我们先从pull一个nginx镜像,然后后台运行该镜像 > docker pull nginx > docker run -d -P nginx:latest ...

  7. C#3.0新增功能09 LINQ 基础02 LINQ 查询简介

    连载目录    [已更新最新开发文章,点击查看详细] 查询 是一种从数据源检索数据的表达式. 查询通常用专门的查询语言来表示. 随着时间的推移,人们已经为各种数据源开发了不同的语言:例如,用于关系数据 ...

  8. C#3.0新增功能09 LINQ 基础03 LINQ 和泛型类型

    连载目录    [已更新最新开发文章,点击查看详细] LINQ 查询基于 .NET Framework 版本 2.0 中引入的泛型类型. 无需深入了解泛型即可开始编写查询. 但是,可能需要了解 2 个 ...

  9. C#3.0新增功能09 LINQ 基础04 基本 LINQ 查询操作

    连载目录    [已更新最新开发文章,点击查看详细] 本篇介绍 LINQ 查询表达式和一些在查询中执行的典型操作. 获取数据源 在 LINQ 查询中,第一步是指定数据源. 和大多数编程语言相同,在使用 ...

  10. C#3.0新增功能09 LINQ 基础05 使用 LINQ 进行数据转换

    连载目录    [已更新最新开发文章,点击查看详细] 语言集成查询 (LINQ) 不只是检索数据. 它也是用于转换数据的强大工具. 通过使用 LINQ查询,可以使用源序列作为输入,并通过多种方式对其进 ...

随机推荐

  1. 【译】Android系统架构

    让我们来快速预览一下整个android系统的架构.从下面的图中我们可以发现,这个架构分为几个不同的层,底层为上一层提供服务.  Linux Kernel android系统建立在一个坚固的基石上:Li ...

  2. sort,ksort,asort的区别

    sort--对数组的val进行排序 ksort--对数组的key值进行排序 asort--对数组进行排序,键与值的对应关系不变 1.sort对数组排序 格式如下:bool sort(array &am ...

  3. 用CSS为表格添加边框

    格式: <style type="text/css"> table tr td,th {border:1px solid #000;} </style>

  4. Emiller's Advanced Topics In Nginx Module Development

    Emiller的Nginx模块开发指南 By Evan Miller DRAFT: August 13, 2009 (changes) 翻译:Kongch @2010年1月5日 0:04am -- 2 ...

  5. [LeetCode]题解(python):098 Validate Binary Search Tree

    题目来源 https://leetcode.com/problems/validate-binary-search-tree/ Given a binary tree, determine if it ...

  6. [LeetCode]题解(python):041-First Missing Positive

    题目来源 https://leetcode.com/problems/first-missing-positive/ Given an unsorted integer array, find the ...

  7. 我的工具箱之MySql Front 5.3

    下载地址:http://pan.baidu.com/s/1i4sJpNB 这款软件用来连接MySql,作为前端使用. 它功能全面,方便快捷,如果说有缺点的话,sql窗口中不能执行选择的部分有遗憾. 2 ...

  8. 真不知道JavaScrip【数组】还有这么多东西....

    前段时间在频繁的用数组,但一直不知道JavaScript 数组还有这么多东西,收集了一下看看: 首先:数组是对象的特殊形式,接下来看看它有哪些方法.....push()在末尾增加一个或者是多个 uns ...

  9. C语言命名空间

    //首先要认识到命名空间的使用条件.#include <stdio.h> typedef struct A { int A; } A; typedef union B { int A; } ...

  10. vsUnit单元测试

    在自定义的方法名上[右键]然后选择[创建单元测试],之后在项目中就添加了一个单元测试的项目,找到对应的单元测试的方法[TestMethod()]特性修饰,将单元测试的方法中最后一句:Assert.In ...