1.集合
(1)ArrayList内部存储数据的是一个object数组,创建这个类的对象的时候,这个对象里的数组的长度为0
(2)调用Add方法加元素的时候,如果第一次增加元神,就会将数组的长度变为4往里面加
(3)如果存储数据的数组满了,就会新建一个数组长度是原来的数组的两倍,这个数组被原来的数组的变量所引用
比如自己实现简单的ArrayList Add方法

  1. public class MyArrayList
  2. {
  3. private object[] objArray=new object[];
  4. int index = ;
  5. public void Add(object obj)
  6. {
  7. if (index>=objArray.Length-)
  8. {
  9. object[] newObjArray = new object[objArray.Length*];
  10. Array.Copy(objArray, newObjArray, objArray.Length);
  11. objArray = newObjArray;
  12. }
  13. objArray[index] = obj;
  14. index++;
  15. }
  16. public int Count
  17. {
  18. get
  19. {
  20. return index + ;
  21. }
  22. }
  23.  
  24. /// <summary>
  25. /// 索引器
  26. /// </summary>
  27. /// <param name="i"></param>
  28. /// <returns></returns>
  29. public object this[int i]
  30. {
  31. get
  32. {
  33. return objArray[i];
  34. }
  35. set
  36. {
  37. objArray[i] = value;
  38. }
  39. }

(4)常用集合
“类似数组”集合:ArrayList、List<T>
“键值对”集合(“哈希表”集合):Hashtable、Dictionary<K,V>
“堆栈”集合:Stack、Stack<T>(LIFO)
“队列”集合:Queue、Queue<T>(FIFO)

“可排序键值对”集合:(插入、检索没有“哈希表”集合高效)
SortedList、SortedList<K,V> (占用内存更少,可以通过索引访问)
SortedDictionary<K,V> (占用内存更多,没有索引,但插入、删除元素的速度比SortedList快)
Set 集合:无序、不重复。HashSet<T>,可以将 HashSet类视为不包含值的 Dictionary集合。与List<T>类似。SortedSet<T>(.net4.0支持,有序无重复集合)
“双向链表”集合:LinkedList<T>,增删速度快。

  1. SortedList sortedList = new SortedList();
  2. sortedList.Add("a", "A");
  3. sortedList.Add("x", "X");
  4. sortedList.Add("w", "W");
  5. sortedList.Add("b", "B");
  6.  
  7. foreach (DictionaryEntry item in sortedList)
  8. {
  9. Console.WriteLine(item.Key + " " + item.Value);
  10. }
  11. for (int i = ; i < sortedList.Count; i++)
  12. {
  13. Console.WriteLine(sortedList[sortedList.GetKey(i)]);
  14. }

ArrayList (非泛型)→ List<T>(泛型)
Hashtable(非泛型) → Dictionary<K,V>(泛型)

2.foreach原理
如果一个类要被foreach遍历,就要实现IEnumerable接口
比如:

  1. public class MyArrayList:IEnumerable
  2. {
  3. private object[] objArray=new object[];
  4. int index = ;
  5. public void Add(object obj)
  6. {
  7. if (index>=objArray.Length-)
  8. {
  9. object[] newObjArray = new object[objArray.Length*];
  10. Array.Copy(objArray, newObjArray, objArray.Length);
  11. objArray = newObjArray;
  12. }
  13. objArray[index] = obj;
  14. index++;
  15. }
  16. public int Count
  17. {
  18. get
  19. {
  20. return index + ;
  21. }
  22. }
  23.  
  24. /// <summary>
  25. /// 索引器
  26. /// </summary>
  27. /// <param name="i"></param>
  28. /// <returns></returns>
  29. public object this[int i]
  30. {
  31. get
  32. {
  33. return objArray[i];
  34. }
  35. set
  36. {
  37. objArray[i] = value;
  38. }
  39. }
  40.  
  41. public IEnumerator GetEnumerator()
  42. {
  43. return new MyIEnumerator(objArray, Count);
  44. }
  45. }
  46.  
  47. public class MyIEnumerator : IEnumerator
  48. {
  49.  
  50. private object[] objArr;
  51. /// <summary>
  52. /// 保存的是当前读到的第几个元素,默认-1
  53. /// </summary>
  54. int index = -;
  55. /// <summary>
  56. /// 存储在数组中元素的个数
  57. /// </summary>
  58. int count;
  59. public MyIEnumerator(object[] obj,int count)
  60. {
  61. this.objArr = obj;
  62. this.count = count;
  63. }
  64.  
  65. /// <summary>
  66. /// 返回当前指针指向的元素的值
  67. /// </summary>
  68. public object Current
  69. {
  70. get { return objArr[index]; }
  71. }
  72.  
  73. /// <summary>
  74. /// 将指针向前移动一位并判断当前元素有没有元素
  75. /// </summary>
  76. /// <returns></returns>
  77. public bool MoveNext()
  78. {
  79. index++;
  80. if (index<count)
  81. {
  82. return true;
  83. }
  84. else
  85. {
  86. return false;
  87. }
  88. }
  89.  
  90. public void Reset()
  91. {
  92. throw new NotImplementedException();
  93. }
  94. }
  95. foreach 遍历实际上是这样的
  96. IEnumerator tor = list.GetEnumerator();
  97. while (tor.MoveNext())
  98. {
  99. Console.WriteLine(tor.Current);
  100. }

3.Hashtable
键值对是以键的hash值算出其所对应的下标,存的时候算一下下标,然后存储在下标所对应的位置,取的时候也是一样
Hashtable中的值是存储在bucket[] buckets这个结构数组中
bucket b = new bucket();
b.Key="1";
b.Value="2";
b.hash_coll=b.Key.GetHashCode();
int index = b.hash_coll%buckets.Lenth;
buckets[index]=b
存储的值的顺序是根据键的hash值算出

4.异常处理
int i = 1;
try
{

return i;
}
finally
{
i++;
}
这个程序返回的值为1
Student s = new Student();
s.ID = 1;
try
{

return s;
}
finally
{
s.ID++;
}
这个程序返回的值为s.ID=2

5.Path类
string path = @"d\a\1.txt";
string newPath = Path.ChangeExtension(@"d\1.txt","avi");更改路径字符串的后缀名
newPath = Path.Combine(@"d\12","12.txt");合并多个字符串路径,如果没有"\",自动加上
newPath = Path.GetDirectoryName(path);得到文件路径所在的目录,如果本身就是一个目录,就直接返回这个目录字符串
newPath = Path.GetExtension(path);得到指定文件路径的后缀名,如果不是一个文件路径,返回空字符串
newPath = Path.GetFileName(path);得到指定路径的文件名(带后缀名)
newPath = Path.GetFileNameWithoutExtension(path);得到指定路径的文件名(不带后缀名)
newPath = Path.GetFullPath(path);得到绝对路径
newPath = Path.GetTempPath();得到系统的临时目录
newPath = Path.GetTempFileName();得到一个刚刚创建的临时的文件名
newPath = Assembly.GetExecutingAssembly().Location得到当前运行程序集的路径

6.File类
string path = @"d\a\1.txt";
File.Create(path);创建指定的文件,如果文件已存在,则覆盖
File.AppendAllText(path,"aaaa");向已有的文本文件中追加字符,如果文件不存在,则创建一个新的文件
File.Copy(“source”, “targetFileName”, true);//文件拷贝,true表示当文件存在时“覆盖”,如果不加true,则文件存在报异常。
File.Delete(path);
File.Exists(path);
File.Move(原路径,目标路径);
string str = File.ReadAllText(path,Encoding.Default);读取的文件用什么编码存储就用什么编码读取,有的时候必须指定的编码
格式
string[] lines = File.ReadAllLines(path,Encoding.Default);读取文本文档,返回字符串数组

7.Directory类
Delete(string path) 删除目录,如果要递归删除 调用Delete(string path,bool recursive)
Exists(string) 指定目录是否存在
Move(string oldDir,string newDir) 移动目录 ----改名原理一致
CreateDiectory() 创建目录
string[] GetDirectories() 得到指定目录下的所有的子目录 返回string数组
string[] GetDirectories(string path,string searchPattern,SearchOption opton) 可以按统配符查找子目录
GetFiles() 得到指定目录下的所有的文件

8.字符编码
字符编码就是字符以什么样的二进制排序存入到电脑的硬盘,并按照什么样的规则读取出来并还原.
ASCII码 GB2312 Unicode UTF-8

9.DirectoryInfo类
是1个操作目录的实例类,提供了与静态类Directory类相同的方法 但是做了少部分扩展
当需要对目录进行多次操作的时候 最好是将该目录封装到实例对象中 以便多次操作

10.FileInfo类
是1个操作文件的实例类 提供了静态File相同的方法 但是做了扩展 比如可以得到文件的大小.....等
当需要对同1个文件进行多次操作的时候 最好是将该文件封装到改对象中操作

11.FileStream类
文件的读取:
//1.创建一个文件流对象,并给这个文件流对象指定操作的文件(路径)还有指定操作方式
FileStream fs = new FileStream(@"e:\1.txt", FileMode.Open);
//2.准备一个byte数组,以供文件流对象读取数据并放到这个数组里面
byte[] bytes = new byte[1024 * 1024];
//3.调用文件流的读数据方法,将读出来的字节放入到bytes数组中
fs.Read(bytes, 0, bytes.Length);
//4.将字节数组以指定的编码转换为字符串
string content = Encoding.Default.GetString(bytes);
//5.关闭文件流
fs.Dispose();
推荐使用using关键字释放
文件的写入:
//1.创建一个文件流对象,并给这个文件流对象指定操作的文件(路径)还有指定操作方式
FileStream fs = new FileStream(@"e:\1.txt", FileMode.Create);
//2.将要写人的文字转换为字节数组
byte[] bytes = Encoding.Default.GetBytes("我是要写入的文字");
//3.调用文件流的写入数据方法
fs.Write(bytes, 0, bytes.Length);
//4.关闭文件流
fs.Dispose();

拷贝大文件
using (FileStream fsRead = new FileStream(@"e:\1.wmv",FileMode.Open))
{
using (FileStream fsWrite = new FileStream(@"e:\2.wmv", FileMode.Create))
{
byte[] bytes = new byte[1024 * 1024];
int length;
do
{
length = fsRead.Read(bytes, 0, bytes.Length);//length表示读取的真实的字节数,bytes.Length表示一次预读取的
//字节数
fsWrite.Write(bytes, 0, length);
} while (length == bytes.Length);

}

12.压缩流GZipStream

压缩原理:1.图片2.文本文件3.电影4.字符串
1>压缩:
1.创建读取流File.OpenRead()
2.创建写入流File.OpenWrite();
3.创建压缩流new GZipStream();将写入流作为参数与。
4.每次通过读取流读取一部分数据,通过压缩流写入。
2>解压
1.创建读取流:File.OpenRead()
2.创建压缩流:new GZipStream();将读取流作为参数
3.创建写入流File.OpenWrite();
4.每次通过压缩流读取数据,通过写入流写入数据。

  1. //GZipStream就是对FileStream的又一个包装
  2. //将文本文件1.txt压缩
  3. //1.创建读取文本文件的流
  4. using (FileStream fsRead = File.OpenRead("1.txt"))
  5. {
  6. //2.创建写入文本文件的流
  7. using (FileStream fsWrite = File.OpenWrite("yasuo.txt"))
  8. {
  9. //3.创建压缩流
  10. using (GZipStream zipStream = new GZipStream(fsWrite, CompressionMode.Compress))
  11. {
  12. //4.每次读取1024byte
  13. byte[] byts = new byte[];
  14. int len = ;
  15. while ((len = fsRead.Read(byts, , byts.Length)) > )
  16. {
  17. //通过压缩流写入文件
  18. zipStream.Write(byts, , len);
  19. }
  20. }
  21. }
  22. }
  23. Console.WriteLine("ok");
  24. Console.ReadKey();
  25.  
  26. using (FileStream fsRead = File.OpenRead("yasuo.txt"))
  27. {
  28.  
  29. using (GZipStream gzipStream = new GZipStream(fsRead, CompressionMode.Decompress))
  30. {
  31. using (FileStream fsWrite = File.OpenWrite("jieya.txt"))
  32. {
  33.  
  34. byte[] byts = new byte[];
  35. int len = ;
  36. while ((len = gzipStream.Read(byts, , byts.Length)) > )
  37. {
  38. fsWrite.Write(byts, , len);
  39. }
  40.  
  41. }
  42. }
  43. }
  44. Console.WriteLine("ok");
  45. Console.ReadKey();

13.using
被using管理的对象一出usin块就会自动调用这个对象的Dispose方法
如果类的对象要被using管理,这个对象的类必须实现IDisposable接口
using的本质就是一个try finally,将using中的代码生成在了try中,调用该对象的Dispose()写在了finally中

14.序列化和反序列化
序列化:将对象的状态持久化到某一种设备上(磁盘)
要将类标记为Serializable,这个类的对象才可以被序列化
以二进制的方式序列化,而不是文本文档
反序列化:将之前序列化的文件还原为对象

.net学习之集合、foreach原理、Hashtable、Path类、File类、Directory类、文件流FileStream类、压缩流GZipStream、拷贝大文件、序列化和反序列化的更多相关文章

  1. C#对文件/目录的操作:Path、File、Directory、FileStream、StreamReader、StreamWriter等类的浅析

    以下类的命名空间都是:System.I/0; 一.Path:主要对文件路径的操作! 常用方法: String path=@"C:\a\b\c\123.txt"; 1-1.Path. ...

  2. C#学习笔记:foreach原理

    这篇随笔是对上一篇随笔C#关键字:yield的扩展. 关于foreach 首先,对于 foreach ,大家应该都非常熟悉,这里就简单的描述下. foreach 语句用于对实现  System.Col ...

  3. 批处理学习笔记12 - 拷贝大文件到特定目录 Copy命令

    ~z 获取文件容量大小,配合变量使用 copy 拷贝命令, copy 原地址 新地址 ok,下面上代码 @echo off setlocal enabledelayedexpansion for %% ...

  4. Servlet学习(二):ServletConfig获取参数;ServletContext应用:请求转发,参数获取,资源读取;类装载器读取文件

    转载:http://www.cnblogs.com/xdp-gacl/p/3763559.html 一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件 ...

  5. 06.FileStream类的学习

    //FileStream类是用来操作字节的,也就是可以操作所有文件. 因为所有的文件都是以字节形式来存储的. //StreamReader类和StreamWriter类是用来操作字符的. FileSt ...

  6. WebAPI调用笔记 ASP.NET CORE 学习之自定义异常处理 MySQL数据库查询优化建议 .NET操作XML文件之泛型集合的序列化与反序列化 Asp.Net Core 轻松学-多线程之Task快速上手 Asp.Net Core 轻松学-多线程之Task(补充)

    WebAPI调用笔记   前言 即时通信项目中初次调用OA接口遇到了一些问题,因为本人从业后几乎一直做CS端项目,一个简单的WebAPI调用居然浪费了不少时间,特此记录. 接口描述 首先说明一下,基于 ...

  7. C#foreach原理

    本文主要记录我在学习C#中foreach遍历原理的心得体会. 对集合中的要素进行遍历是所有编码中经常涉及到的操作,因此大部分编程语言都把此过程写进了语法中,比如C#中的foreach.经常会看到下面的 ...

  8. Foreach原理

    本质:实现了一个IEnumerable接口, 01.为什么数组和集合可以使用foreach遍历? 解析:因为数组和集合都实现了IEnumerable接口,该接口中只有一个方法,GetEnumerato ...

  9. Java 集合系列 10 Hashtable详细介绍(源码解析)和使用示例

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

随机推荐

  1. iptables一些经常忘掉易混淆的参数

    -A:新增加一条规则,该规则在原规则的最后面 -p:规定应用于哪种数据包,例如:tcp,udp等 -d:(destination),表示目标IP或网络 -s:(source),表示源IP或网络 -j: ...

  2. shell的内建命令和外部命令

    shell的内建命令和外部命令 Shell执行的命令可以分为内建命令(built-in)和外部命令(external),前者是构建在shell内部:后者是一个独立的文件(可以是二进制文件,也可以是一个 ...

  3. android源代码提示文本框还能输入多少个字符

    public class TestAndroidActivity extends Activity { /** Called when the activity is first created. * ...

  4. 动态插入、添加删除表格行的JS代码

    <html> <head> <title>Table对象的方法</title> <script language="JavaScript ...

  5. C#里List.Sort的用法

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace List ...

  6. 基于HttpListener的web服务器

    写在前面 前面两篇文章分别介绍了基于原始socket的web服务器和基于tcpListener的web服务器,本篇文章将继续介绍另外一种基于HttpListener的. HttpListener Ht ...

  7. 简单聊下IO复用

    没图,不分析API Java中IO API的发展:Socket -> SocketChannel -> AsynchronousSocketChannelServerSocket -> ...

  8. [BZOJ1064][Noi2008]假面舞会

    [BZOJ1064][Noi2008]假面舞会 试题描述 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一 个自己喜欢 ...

  9. [BZOJ2683][BZOJ4066]简单题

    [BZOJ2683][BZOJ4066]简单题 试题描述 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要维护两种操作: 命令 参数限制 内容 1 x y A 1<=x ...

  10. SQL面试积累

    以下题目都在MySQL上测试可行,有疏漏或有更优化的解决方法的话欢迎大家提出,我会持续更新的:) 有三个表,如果学生缺考,那么在成绩表中就不存在这个学生的这门课程成绩的记录,写一段SQL语句,检索出每 ...