下面通过用c#的字符串和Hashtable类来实现一个简体字转繁体字的功能,然后分析一些c#的语法
源码
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 简体字转繁体字
{
class Program
{
static void Main(string[] args)
{
string[] simpleStrs = File.ReadAllLines(@"E:\code\test\简体字.txt",Encoding.Default);
string simpleStr = String.Join("", simpleStrs);
string[] complexStrs = File.ReadAllLines(@"E:\code\test\繁体字.txt",Encoding.Default);
string complexStr = String.Join("", complexStrs);
//Console.WriteLine(complexStr);
Hashtable transform=new Hashtable();
for (int i = 0; i < simpleStr.Length; i++)
{
transform.Add(simpleStr[i], complexStr[i]);
}
Console.WriteLine("请输入一句话");
string originalStr = Console.ReadLine();
StringBuilder stb = new StringBuilder();
for (int i = 0; i < originalStr.Length; i++)
{
if (transform.Contains(originalStr[i]))
{
stb.Append(transform[originalStr[i]]);
}
else
{
stb.Append(originalStr[i]);
}
}
Console.WriteLine("转化为繁体字为:");
Console.WriteLine(stb);
Console.ReadKey();
}
}
}
程序运行结果
值类型和引用类型
区别:
1. 值类型和引用类型在内存上存储的地方不一样
2. 传递值类型和引用类型的时候,传递的方式不一样。
值类型:int、double、bool、struct、enum 等存储在栈中。
引用类型:string、自定义类等,应用类型的值存在堆中,在栈中存的是堆中的地址。
4. 字符串的不可变性:指的是堆里面的内容不可变,这种内容具有唯一性,所以如果你有很多个string都叫”abc”,实际上”abc”在,栈里的内容可以变。
5. 即时窗口可以查看内存地址。
6. 如果是在想改变字符串中某个字符怎么办呢,首先将字符串转换为char类型的数组,这个数组存在栈区,调用ToCharArray();返回char类型数组,然后改变,然后调用string(char [])这个构造函数再产生一个新String;
7. 我们大量对字符串进行拼接赋值操作时,内存中会产生大量的垃圾,这是我们需要StringBuilder,
string的方法
函数名 | 作用 |
---|---|
Equals() | 比较字符串,第二个参数可设为StringComparison.OrdinalIgnoreCase |
Split() | 字符串分割,第一个参数可以是不需要的那些字符构成的数组, 第二个参数StringSplitOption.RemoveEmptyEntries 把空项移除,返回分割出来的字符串数组;可以用来处理Jeson数据等格式化数据; |
IndexOf | 字符串中第一次出现某个序列的位置 |
Trim() | 去除字符串两边的空格 |
Join() | 把字符串数组格式化为字符串 |
继承注意事项
继承构造函数 在子类构造函数的函数列表里只能写:base(,,)不能写:父类名(,,,)
当子类隐藏父类的成员方法,可以在返回类型前加关键字new 来隐藏从父类哪里继承来的成员,隐藏的后果是子类调用不到父类的成员;
集合
里氏转换:
就是子类对象可以赋值给父类引用(隐式转换),如果父类引用指向的是子类对象,可以把父类强行转换为子类(显式转换),当然用is或as可以判断是不是那种对象;
is : 判断类型,如果是的那就返回true 否则返回false;需测试没有关系的类之间的情况;
as: 进行强转,如果成功就返回转换得到的那个对象,失败就返回null;
ArrayList
是一个集合:我们主要用泛型类型,这个类型不怎么用了 Array 类型一定,然后长度可变;
表示添加单个数据,其实都是引用无所谓的啦。很多数据的一个集合,相对于数组有两大好处;类型可以不一样,长度可变。
函数名 | 作用 |
---|---|
add(object) | 可以放object的任意对象 |
addRange | 添加集合的时候使用 |
clear | 移除所有的元素 |
Remove | 根据对象删除 |
RemoveAt | 根据下标删除 |
RemoveRange | 根据下标范围删除 |
Contains | 判断是否包含指定的对象 |
sort | 排序,有些不同类型的元素排序没有意义 |
Reverse | 逆序 |
Insert | 插入对象 |
InsertRange | 插入一定范围的元素 |
有个Count属性和别的对象的Length属性是一样的。
size() Capacity属性表示已分配的容量 刚开始为4,然后每次扩大一倍。
Hashtable
是键值对集合;(table开头小写哦)
在键值对集合中,是根据键找值的,用键做下标; 用foreach循环来遍历键值对集合,;
hashtable里面有两个重要的属性一个是Keys是键的集合,一个是Values是值的集合。键只能出现一次,值可以出现很多次;
函数名 | 作用 |
---|---|
Add(key,value) | 在现有HashTable里面试图添加一个键值对 |
Contains(key) | 在现有HashTable判断是否包含某个键 |
ContainsKey(key) | 在现有HashTable判断是否包含某个键 |
ContainsValue(value) | 在现有HashTable判断是否包含某个值 |
ContainsValue
添加键值对的时候可以使用Add,也可以使用ht[键]=值(调用insert); 可以使用Contains和ContainsKey来判断是否包含某个键,用ContainsValue判断是否包含某个值;
foreach
foreach的效率比for要低一点;
var
c#是一门强类型语言,在代码当中必须对每一个变量的类型有一个明确的定义;
var用于弱类型中,var根据值能够推断出来类型,object有个GetType可以获取这个对象的类型。隐式类型的局部变量必须初始化,var一般用在foreach里面
path
是静态类
在System.IO里面,
函数名 | 作用 |
---|---|
GetFileName(“文件的全路径”) | 获取当前文件的文件名 |
GetFileNameWithoutExtension | 获得不包括扩展名的文件名 |
GetExtension | 获得文件的扩展名 |
GetDirectoryName | 获得当前文件夹的名字 |
GetFullPath | 获取当前文件的全路径 |
string [] contents=File.ReadAllLines(path,Encoding.Default);
Directory.GetFiles(path,”*.txt”);//第二个选项是正则表达式匹配;这个是Directory类的静态方法;这个返回的是带目录名的文件名
DirectoryInfo类的对象有一个GetFiles和EnumerateFiles的方法也可以,返回的是不带目录名的文件名;
DirectoryInfo类有另外的实例方法GetDirectory和EnumerateDirectory()可以获取子文件夹的信息;
File类
是静态类
方法名 | 作用 |
---|---|
Create(“”) | 根据目录试图创建一个文件,如果文件已存在截取内容为空 |
Delete(“”) | 根据目录试图删除一个文件,如果文件不存在 |
Copy(源文件,目标文件) | 复制源文件,试图粘贴到目标文件 |
move(源文件,目标文件) | 移动一个文件到另一个地方 |
ReadAllBytes() | 从文件中读取一个字节数组 |
Encoding.Default.GetString(字节数组) | 把字节数组转换为字符串 |
Encoding.Default.GetBytes(字符串) | 把字符串转换为字节数组 |
WriteAllBytes() | 把字节数组写入文件里 |