30天C#基础巩固------集合,File(文件操作 ),Encoding处理字符集

简介: 30天C#基础巩固------集合,File(文件操作 ),Encoding处理字符集

一:泛型


 

关于泛型我自己也不是很好的理解,但是具体的运用还是可以的,可以这样的理解,我们定义一个数组,但是不知道将来它是保存什么类型的值,很是矛盾,这个时候泛型就出现了,它可以解决这个场景,list   以前这里是类型,前提是我们知道这里将来保存什么值,现在不知道了使用T(Type)来表示,将来什么类型的值都可以保存在里面。这个在集合,项目底层一些公共的接口,类之中使用的特别多。


二:集合


线型集合----List


679140-20160524190750631-842837501.png


List<int> array = new List<int>();
int[] str = { 0, 0, 0, 0, };
array.Add(1);
array.Add(2);
array.Add(5);
array.AddRange(str);      //这里是添加一个数组到集合中。
array.Remove(5);           //这里是添加的是一个固定的数字。
array.RemoveAt(1);       //这里的item就是我们数组的下标。我们可以利用这个删除元素。
array[0] = 23;              //修改第一个元素
foreach (var item in array)         //这里是关于集合的循环输出。
{
    Console.WriteLine(item.ToString());
}
Console.ReadKey();


离散集合


Dictionary<string,int> dic=new Dictionary<string,int>();
Dictionary<string, string> dic = new Dictionary<string, string>();
//初始化
dic.Add("张辉", "1193451014");
dic.Add("ahui", "1193451014");
dic.Add("小辉", "1193451014");
dic.Add("王辉", "1193451014");
bool a=dic.ContainsKey("ahui");                     //利用键来看是否在集合里面保存
Console.WriteLine(a);
//这个键值对集合---我们需要了解到如何循环的输出
foreach (KeyValuePair<string, string> item in dic)          //输出的时候注意临时变量(item)的类型-----KeyValuePair<string, string>
{
    Console.WriteLine(item.Key + "," + item.Value);
}
Console.ReadKey();



三:文件操作


 

 文件是什么:是硬盘里面的一个内存,是一堆字节快。


679140-20160524190751303-1505325630.png



1:命名空间

System.IO; //文件的命名空间


2:FileStream文件流,将文件以字节的方式进行读写。



679140-20160524190752694-1521992743.png


上面的图片是关于文件的一些常用的方法和类。下面是一些练习。


--->FileStream文件流。


    1:关于文件流的写。


我们看一FileStream有哪些方法。都是一些构造函数。



679140-20160524190754663-2006833674.png


---->WriteByte()方法

//FileStream-----利用文件流来写,第一个参数是文件名,第二个是枚举类型,我们选择重新写入。第三个是权限的选择。            
FileStream fWrite=new FileStream("ahui.txt",FileMode.Create,FileAccess.Write);
fWrite.WriteByte(97);              //写入了,但是我们要是没有调用display或者Flush就不会写入文件,只是写入缓冲期。
//Flush()-----清除此流的缓冲区,使得所有缓冲的数据都写入到文件中。
fWrite.Flush();                        //这样才能写入文件中。
Console.WriteLine(fWrite);
Console.ReadKey();



上面的代码要是我们从客户端输入就会出现乱码,我们需要通过设置编码的格式来修改。


----->Write()


Console.WriteLine("请输入?");
string sInput = Console.ReadLine();
//设置编码格式----有助于我们往文件中写入汉字
byte[] bs = Encoding.Default.GetBytes(sInput);
fWrite.Write(bs,0,5);              //写入了,但是我们要是没有调用display或者Flush就不会写入文件,只是写入缓冲期。


---->ReadByte()

//利用using来写,这个最后会自动的调用Display()方法 ,使我们写在缓冲区的内容写入到文件中。
using (FileStream fRead=new FileStream("ahui.txt",FileMode.Open,FileAccess.Read))
{
    List<byte> list=new List<byte>();                //设置一个集合
    int res = -1;
    while ((res=fRead.ReadByte( ))!=-1)           //利用循环来把文件中的值添加到集合中
    {
         list.Add((byte)res);                             //集合的Add()方法。
    }
}     
Console.ReadKey();



679140-20160524190756288-1676646411.png


这里的49和50是我文件中保存的值。



---->Read

using (FileStream fReader=new FileStream("ahui.txt",FileMode.Open,FileAccess.Read))
{
    //使用数组来存储一个块字节
    byte []bs=new byte[10];                                     //这个就相当于缓冲区一样
    int count = fReader.Read(bs,0,bs.Length);        //要求读取10个字节,从数组的第0位开始,全部存储完。     
}


679140-20160524190758147-1689590414.png


---->复制文件


//思路---------------先读取文件,后写入文件。
Console.Write("请输入你要复制的路径#");
string str = Console.ReadLine();
if (!File.Exists(str))          //判断文件是否存在
{
    Console.WriteLine("文件不存在,,,你搞我呀,");
    Console.ReadKey();
    return; //直接跳出.
}
//走到这里就表示文件存在
Console.Write(" 请输入要往哪里复制#");
string strM = Console.ReadLine();
using (FileStream fReader=new FileStream(str,FileMode.Open,FileAccess.Read))                //进行读的操作
{
    using (FileStream rWrite=new FileStream(strM,FileMode.Create,FileAccess.Write))      //进行写操作
    {
        //第一种------利用ReadByte()和WriteByte()按照字节来进行处理
        int res = -1;
        while ((res=fReader.ReadByte())!=-1)             //这里看是否读取到值,是否进行循环,没读取到res=-1,则不进行写入操作。
        {
            rWrite.WriteByte((byte)res);                     //参数只能是byte类型的,我们需要强制类型转换。
        }                    
    }
}
Console.WriteLine("OK");
Console.ReadKey();


679140-20160524190759553-1583771198.png


679140-20160524190801147-415679120.png

上面的效率不是很高,我们可以利用Read()/Write()来进行,效率比之前的高很多。


//第二种------利用Read()和Write()按照字节来进行处理
//这里利用的是buffer,我们需要一个字节数组来处理。
byte [] buBytes=new byte[1024*1024*10];         //申请了一个10M大小的空间。                          
int count = 0;
while ((count = fReader.Read(buBytes, 0, buBytes.Length)) > 0)       //把读取到的内容写入到了buffer中,我们只要文件中有值,count就会大于0。
{
    rWrite.Write(buBytes, 0, count);                                   //把buffer中的值写入到文件中。          
}


四:Encoding处理字符集。


声明一个字符编码,

Encoding en = Encoding.GetEncoding("gb2312"); //声明一个gb2312的字符编码


得到计算机中的所有字符编码


EncodingInfo[] ens = Encoding.GetEncodings();  //得到所有的编码 ,返回的是一个数组。+EncodingInfo是一个类,里面有一些关于编码的属性。
for (int i = 0; i <ens.Length ; i++)
{
    Console.WriteLine("{0},{1},{2}",ens[i].CodePage,ens[i].DisplayName,ens[i].Name);
}
Console.ReadKey();



我们通过控制台可以看到PC中的所有的编码。

679140-20160524190802866-1617430916.png


上面的代码中有注释,我们可以发现有些编码我们可以通过一个类来声明一个数组,这样就可以点 出来我们的所有的编码,其中有编码的编码数,编码名称,编码说明。


eg:将数字转换为16进制。



for (int i = 0; i < 17; i++)
{
    Console.WriteLine(i.ToString("x2"));           //这里面的x表示的是编码的格式为16进制。 2表示保留2位数。
}
Console.ReadKey();


五:关于继承被初识化的调用问题



  子类继承基类,当子类被初始化的时候,我们是先调用基类的构造函数,在调用子类的构造函数,这里有个叫做回溯的问题。是从里到外的。


/// <summary>
/// 基类
/// </summary>
public class Parset
{
    public Parset()
    {
        Console.WriteLine("基类被调用了。");
    }
}
/// <summary>
/// 子类
/// </summary>
public class ChildA:Parset
{
    private string name = "阿辉";
    public ChildA()
    {
        Console.WriteLine("子类被调用了,,,");
    }
    public void SayHello()
    {
        Console.WriteLine(name);
    }
}


ChildA ca=new ChildA();
ca.SayHello();
Console.ReadKey();


我们通过这里就可以发现这个规则。




679140-20160524190804584-1588216482.png








目录
相关文章
|
1月前
|
Java 物联网 C#
C#/.NET/.NET Core学习路线集合,学习不迷路!
C#/.NET/.NET Core学习路线集合,学习不迷路!
|
3月前
|
存储 C# 索引
C# 一分钟浅谈:数组与集合类的基本操作
【9月更文挑战第1天】本文详细介绍了C#中数组和集合类的基本操作,包括创建、访问、遍历及常见问题的解决方法。数组适用于固定长度的数据存储,而集合类如`List<T>`则提供了动态扩展的能力。文章通过示例代码展示了如何处理索引越界、数组长度不可变及集合容量不足等问题,并提供了解决方案。掌握这些基础知识可使程序更加高效和清晰。
88 2
|
2月前
|
开发框架 NoSQL MongoDB
C#/.NET/.NET Core开发实战教程集合
C#/.NET/.NET Core开发实战教程集合
|
2月前
|
存储 C#
【C#】大批量判断文件是否存在的两种方法效率对比
【C#】大批量判断文件是否存在的两种方法效率对比
52 1
|
3月前
|
SQL 开发框架 安全
并发集合与任务并行库:C#中的高效编程实践
在现代软件开发中,多核处理器普及使多线程编程成为提升性能的关键。然而,传统同步模型在高并发下易引发死锁等问题。为此,.NET Framework引入了任务并行库(TPL)和并发集合,简化并发编程并增强代码可维护性。并发集合允许多线程安全访问,如`ConcurrentQueue&lt;T&gt;`和`ConcurrentDictionary&lt;TKey, TValue&gt;`,有效避免数据不一致。TPL则通过`Task`类实现异步操作,提高开发效率。正确使用这些工具可显著提升程序性能,但也需注意任务取消和异常处理等常见问题。
57 1
|
2月前
|
XML 存储 缓存
C#使用XML文件的详解及示例
C#使用XML文件的详解及示例
116 0
|
3月前
|
安全 C# 开发者
C# 一分钟浅谈:文件操作与文件流详解
【9月更文挑战第4天】在日常开发中,文件的读写是基本而重要的任务。C# 通过 `System.IO` 命名空间提供了多种工具,如 `FileStream`、`StreamReader` 和 `StreamWriter` 等,用于处理文件和流。本文从基础概念入手,详细介绍了这些类的使用方法,并讨论了常见错误及其避免策略,包括文件不存在、权限问题和文件被占用等。通过示例代码,展示了如何创建、读取文件以及进行二进制数据操作,并强调了异常处理和性能优化的重要性。掌握这些技巧对于提升编程能力至关重要。
213 2
|
4月前
|
监控 安全 C#
使用C#如何监控选定文件夹中文件的变动情况?
使用C#如何监控选定文件夹中文件的变动情况?
125 19
|
4月前
|
编译器 C# Windows
C#基础:手动编译一个.cs源代码文件并生成.exe可执行文件
通过上述步骤,应该能够高效准确地编译C#源代码并生成相应的可执行文件。此外,这一过程强调了对命令行编译器的理解,这在调试和自动化编译流程中是非常重要的。
376 2
|
4月前
|
文字识别 C# Python
使用C#将几个Excel文件合并去重分类
使用C#将几个Excel文件合并去重分类
41 3