.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     }
原文地址:https://www.cnblogs.com/HuoAA/p/4051841.html