.NET基础回顾(五)

一.字符串

1. 字符串的恒定性

(1)字符串拘留池的概念(即时窗口的使用);

(2)在创建一个字符串对象的时候,会先在字符串拘留池寻找是否有相同字符串内容的对象,如果有有就直接让变量指向这个对象,如果没有就创建新的对象;

2. 字符串部分函数用法

(1)string.Empty代表空字符串“”,而不是null;

(2)string.Compare(s1,s2),用来比较两个字符的大小;

(3)string.Concat(s1,s2),连接两个字符串并组成一个新串;

(4)s1.Contains(s2),判断指定的串是否包含指定的字串,返回bool值;

(5)s1.EndsWith(s2)(s1.StartsWith(s2)),判断指定的字符串是以指定的字串结尾(开始);

(6)s1.Equals(s2),判断是否与指定字符串相同;

(7)string.Format(“我爱{0},你爱{1}”,“你”,“他”),格式化字符串;

(8)s1.IndexOf()(s1.LastIndexOf()),查看指定子串在字符串中的索引(从字符串结尾往前查);

(9)str3.Insert(1,“我”),指定位置插入字符串;

(10)string.IsNullOrEmpty(str1),判断字符串是否为空串或者为null;

(11)str1.Remove(3),如果只穿一个int类型的数,会保留前面的,删除后面的(还有其他参数的重载方法);

(12)str1.Replace(str2,str3),替换;

(13)str1.Split(),分割成字符数组,可以用字符,字符串,空等进行分割,分割条件可以枚举出来;

(14)str1.Substring(1),从指定位置开始截取字符串;

(15)ToCharArray(),转换成字符数组;

(16)ToLow(),ToUpper(),转换大小写;

(17)Trim(),取消字符串前面和后面的空格;

3. StringBuilder(高效的字符串操作)

(1)sb.Append(),在sb对象里的字符串中追加新串;

(2)sb.AppendLine(),追加字符串并在末尾加换行符;

(3)和String比较来说,sb对象是可变的,String是不可变化的,当改变sb里的字符串时,不会重新开辟空间,而是直接在堆空间内改变sb所指的字符数组;

二.集合

1. 我们自己的集合和索引器

程序示例:

 1 class MyArrayList
 2     {
 3         int index = 0;
 4         private int[] arr;
 5
 6         /// <summary>
 7         /// 构造函数用来指定集合的长度
 8         /// </summary>
 9         /// <param name="capacity"></param>
10         public MyArrayList(int capacity)
11         {
12             this.arr = new int[capacity];
13         }
14
15         /// <summary>
16         /// Add方法
17         /// </summary>
18         /// <param name="value"></param>
19         public void Add(int value)
20         {
21             if (index >= arr.Length)
22             {
23                 int[] newArr = new int[arr.Length*2];
24                 Array.Copy(arr,newArr,arr.Length);
25                 arr = newArr;
26             }
27             arr[index++] = value;
28         }
29
30         /// <summary>
31         /// 索引器
32         /// </summary>
33         /// <param name="index"></param>
34         /// <returns></returns>
35         public int this[int index]
36         {
37             get
38             {
39                 return arr[index];
40             }
41             set
42             {
43                 arr[index] = value;
44             }
45         }
46
47         /// <summary>
48         /// 元素的个数
49         /// </summary>
50         public int Count
51         {
52             get
53             {
54                 return index;
55             }
56         }
57
58     }

2. ArrayList

(1)list.AddRange(ICollection c),可传参数为实现了ICollection接口的实现类的对象,添加集合;

(2)ArrayList内部存储数据是一个object数组,创建这个类的对象的时候,这个对象里的数组长度为0;

(3)调用Add方法加元素的时候,如果第一次增加元素,就会将数组的长度变成4往数组里加;

(4)如果存储数据的数组满了,就会新建一个数组长度是原来数组的两倍,这个数组被原来数组的变量所引用;

(5)list.Remove(),删除指定的值类型对象,删除的是第一个;

程序实例:

Person p = new Person(){Name = “新疆妹”};

list.Add();

list.Add();

list.Remove(p);

(6)list.RemoveAt(),删除指定的下标的元素;

(7)list.RemoveRange(),删除指定的范围;

(8)list.Clear(),清空动态数组,清空后数组的容量Capacity不变;

(9)Object obj = list.Clone();

三.Foreach原理

1. 如果我们自己写的集合要被遍历,必须实现IEnumerator接口,因为foreach背后的代码如下:

IEnumerator tor = list.GetEnumerator();

While(tor.MoveNext())

{

Console.WriteLine(tor.Current);

}

2. GetEnumerator()这个方法,返回一个实现了IEnumerator接口的对象;

3. 所以我们要实现IEnumerator这个接口中GetEnumerator()的话,就要写一个类来实现IEnumerator(),方法返回这个类的实例;

4. IEnumerator接口中定义一个Current只读属性,MoveNext方法,Reset()方法;

5. MoveNext方法的作用,将指针向前移动一位,并判断当前位是否有元素,如果有则返回true,否则返回false;

6. Current只读属性,得到当前指针指向的值;

7. 这两个方法都是在操作数组,而这个数组在我们的集合类中,所以我们要想办法将集合类的数组传递到当前迭代器类中;

8. 迭代器对象在集合类中创建,所以可通过构造函数让集合将他的数组传递给迭代器,这个时候迭代器已经有了数组的引用;

9. 实现MoveNext方法,声明index变量,用来保存当前指针指向的数组的索引,默认在-1,每调用一次这个方法,就index++,接着再判断index元素是否存在,index<count就存在,所以迭代器还需要知道元素的有效个数,通过构造函数传入;

10. 实现Current属性,return arr[index];

程序示例:

  1 /// <summary>
  2     ///  我们自己的集合. //int类型的数.
  3     /// </summary>
  4     class MyArrayList : IEnumerable
  5     {
  6         /// <summary>
  7         ///  数组字段.  这个数组用来存储整型数据。
  8         /// </summary>
  9         private int[] arr; //10.10
 10
 11         /// <summary>
 12         ///  保存着1次往arr里存储数据的索引
 13         /// </summary>
 14         int index = 0;//1   2
 15
 16         /// <summary>
 17         ///  元素的个数
 18         /// </summary>
 19         public int Count
 20         {
 21             get
 22             {
 23                 return index;
 24             }
 25         }
 26
 27         /// <summary>
 28         ///  构造函数用来初始化数组的长度
 29         /// </summary>
 30         /// <param name="capcity"></param>
 31         public MyArrayList(int capcity)
 32         {
 33             this.arr = new int[capcity];
 34         }
 35
 36         public MyArrayList() { }
 37
 38         public void Add(int value) //1  index  2   3
 39         {
 40             //当新增1个元素的时候.
 41             //我判断一下 arr 有没有存满  如果没有存满就继续往里存
 42             if (index >= arr.Length)  //
 43             {
 44                 //我重新创建1个数组 数组的长度是原来的2倍
 45                 int[] newArr = new int[arr.Length * 2];
 46                 //将原来的数组中的数据拷贝到新数组中.
 47                 Array.Copy(arr, newArr, arr.Length);
 48                 //然后将旧数组的变量指向新数组
 49                 arr = newArr;
 50             }
 51             arr[index++] = value;
 52         }
 53
 54         /// <summary>
 55         ///  索引器
 56         /// </summary>
 57         /// <param name="index"></param>
 58         /// <returns></returns>
 59         public int this[int index]
 60         {
 61             get
 62             {
 63                 return arr[index];
 64             }
 65             set
 66             {
 67                 arr[index] = value;
 68             }
 69         }
 70
 71         /// <summary>
 72         ///  新增1个范围.
 73         /// </summary>
 74         /// <param name="arr"></param>
 75         public void AddRange(int[] arr)
 76         {
 77             foreach (int item in arr)
 78             {
 79                 this.Add(item);
 80             }
 81         }
 82
 83         //实现IEnumerable成员
 84         public IEnumerator GetEnumerator()
 85         {
 86             return new MyIEnumerator(this.arr,Count);
 87         }
 88
 89     }
 90
 91     class MyIEnumerator : IEnumerator
 92     {
 93         private int[] arr;
 94
 95         /// <summary>
 96         ///  保存的是当前读到第几个元素 默认-1
 97         /// </summary>
 98         int index = -1;
 99
100         int count;
101
102         public MyIEnumerator(int[] arr,int count)
103         {
104             this.arr = arr;
105             this.count = count;
106         }
107
108         /// <summary>
109         ///  返回当前指针指向的元素的值
110         /// </summary>
111         public object Current
112         {
113             get
114             {
115                return  this.arr[index];
116             }
117         }
118
119         /// <summary>
120         ///  是将指针向前移动1位,并判断当前位有没有元素.
121         /// </summary>
122         /// <returns></returns>
123         public bool MoveNext()
124         {
125             index++;
126             if (index < this.count)
127                 return true;
128             else
129                 return false;
130         }
131
132         public void Reset()
133         {
134             throw new NotImplementedException();
135         }
136     }
时间: 2024-11-08 04:01:45

.NET基础回顾(五)的相关文章

1、java基础回顾与加强

一.    基础回顾 1   集合 1.1  集合的类型与各自的特性 ---|Collection: 单列集合 ---|List: 有存储顺序, 可重复 ---|ArrayList:    数组实现, 查找快, 增删慢 由于是数组实现, 在增和删的时候会牵扯到数组 增容, 以及拷贝元素. 所以慢.数组是可以直接按索引查找, 所以查找时较快 ---|LinkedList:   链表实现, 增删快, 查找慢由于链表实现, 增加时只要让前一个元素记住自己就可以, 删除时让前一个元素记住后一个元素, 后

Android核心基础第五天

一.学习目标及要求 课程目标 课程内容(必须讲的内容,就是讲课的知识点的顺序) * 掌握Activity 配置 * 掌握 Intent 显示意图 * 掌握 Intent 隐式意图 * 掌握两种意图的使用场景 * 掌握 activity 开启的数据传递 * 掌握activity的生命周期 * 掌握横竖屏切换的生命周期 * 掌握不同android版本 生命周期的细微差别 * 掌握开启activity获取返回值 * 掌握请求码 结果码的作用 * 掌握程序入口activity配置参数 * 掌握显示意图 

【DAY26】JAVA 基础回顾

基础回顾 ---------------- 1.跨平台 os JVM : sandbox 1995 2.基本数据类型 byte //1 -128 ~ 127 short //2 -32768 - 32767 int //4 long //8 float //4 doule //8 char //2 boolean //1 3.引用类型 [] class interface 4.运算符 && //短路 || //短路 & // | // ^ //抑或,相同0,不同为1 >>

Thinkphp回顾(五)之前台模板中的基本语法

一.导入CSS和JS文件 的三种方式  (了解) 1.link方式(常规) <link rel=’stylesheet’ type=’text/css’ href=’__PUBLIC__/Js/test.css/> <script src='__PUBLIC__/Js/test.js'></script> //导入Public文件夹下面的Js目录中的test.js文件和Css文件夹下的test.css文件 2.import <import type='js' fi

iOS 基础 第五天(0809)

0809 - 内存管理,只对oc对象生效. alloc.retain.release.retainCount 局部变量是放在栈里面的,oc对象是放在堆里面的.栈里面的内容系统自动回收,而堆里面的内容还在,所以不适用ARC的时候要手动回收这些对象内容 如下图所示: 对象的基本结构 每一个对象内部都有一个引用计数器,占用4个字节,是一个整数,当这个引用计数器的值为0的时候,这个对象就会被系统回收销毁.当一个对象刚刚诞生的时候,这个计数器的值为1 如下图所示: 引用计数器的作用 如下图所示: 引用计数

Bootstrap&lt;基础十五&gt; 输入框组

Bootstrap 支持的另一个特性,输入框组.输入框组扩展自 表单控件.使用输入框组,可以很容易地向基于文本的输入框添加作为前缀和后缀的文本或按钮. 通过向输入域添加前缀和后缀的内容,您可以向用户输入添加公共的元素.例如,可以添加美元符号,或者在 Twitter 用户名前添加 @,或者应用程序接口所需要的其他公共的元素. 向 .form-control 添加前缀或后缀元素的步骤如下: 把前缀后后缀元素放在一个带有 class .input-group 的 <div> 中. 接着,在相同的 &

平面设计 计算机基础知识教程 Excel2010基础教程 Word2010基础教程 PPT2010基础教程 五笔打字视频教程

热门推荐电脑办公计算机基础知识教程 Excel2010基础教程 Word2010基础教程 PPT2010基础教程 五笔打字视频教程 Excel函数应用教程 Excel VBA基础教程 WPS2013表格教程 更多>平面设计PhotoshopCS5教程 CorelDRAW X5视频教程 Photoshop商业修图教程 Illustrator CS6视频教程 更多>室内设计3Dsmax2012教程 效果图实例提高教程 室内设计实战教程 欧式效果图制作实例教程 AutoCAD2014室内设计 Aut

Linux基础回顾(2)——Linux系统分区二三事

问题来自Linux教材,答案自我整理难免会有不足之处.这是我Linux期末的总结 1. 一块硬盘上可以有几种类型的分区?各自可以有多少个?(各个分区能安装操作系统吗?) 硬盘分区有三种类型的分区:主分区,扩展分区,逻辑分区:一个硬盘最多能划分4个主分区,或者3个主分区加上一个扩展分区,扩展分区上可以划分多个逻辑分区(最多20个).能安装操作系统. 2.用户能否在安装过程中创建扩展分区呢? 分区工具在文件系统类型中没有提供扩展(extended)分区类型,即用户不能根据需要不能手工创建扩展分区.安

PHP移动互联网开发笔记(6)——MySQL数据库基础回顾

最近看了一些架构方面的资料,但是发现基础知识都不怎么牢固,接下来的一段时间,我会定期总结基础知识. 一.数据类型 1.整型 数据类型 存储空间 说明 取值范围 TINYINT 1字节 非常小的整数 带符号值:-128~127 无符号值:0~255 SMALLINT 2字节 较小的整数 带符号值:-32768~32767 无符号值:0~65535 MEDIUMNT 3字节 中等大小的整数 带符号值:-8388608~8388607 无符号值:0~16777215 INT 4字节 标准整数 带符号值

[C#] C# 基础回顾 - 匿名方法

C# 基础回顾 - 匿名方法 目录 简介 匿名方法的参数使用范围 委托示例 简介 在 C# 2.0 之前的版本中,我们创建委托的唯一形式 -- 命名方法. 而 C# 2.0 -- 引进了匿名方法,在 ≥ C# 3.0 的版本中,我们会用 Lambda 表达式进行取代匿名方法,并且用 Lambda 表达式作为编写内联代码的首选方式,因为它更简洁. 匿名方法是,顾名思义,匿名方法就是没有名称的方法.匿名方法最明显的好处就是:可以降低额外另写一个方法的工作量:另外一个好处就是可以直接访问调用者的变量,