首页 > 代码库 > .NET基础回顾(五)

.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             get38             {39                 return arr[index];40             }41             set42             {43                 arr[index] = value;44             }45         }46 47         /// <summary>48         /// 元素的个数49         /// </summary>50         public int Count51         {52             get53             {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 Current112         {113             get114             {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             else129                 return false;130         }131 132         public void Reset()133         {134             throw new NotImplementedException();135         }136     }

 

.NET基础回顾(五)