String
- 公共方法 StartsWith(String) 确定此字符串实例的开头是否与指定的字符串匹配。
- 公共方法 StartsWith(String, StringComparison) 确定在使用指定的比较选项进行比较时此字符串实例的开头是否与指定的字符串匹配。
- 公共方法 StartsWith(String, Boolean, CultureInfo) 确定在使用指定的区域性进行比较时此字符串实例的开头是否与指定的字符串匹配。
- 公共方法 Trim() 从当前 String 对象移除所有前导空白字符和尾部空白字符。
- 公共方法 Trim(Char[]) 从当前 String 对象移除数组中指定的一组字符的所有前导匹配项和尾部匹配项。
- 公共方法 TrimEnd 从当前 String 对象移除数组中指定的一组字符的所有尾部匹配项。
- 公共方法 TrimStart 从当前 String 对象移除数组中指定的一组字符的所有前导匹配项。
- 公共方法 IndexOf 从当前String的0索引开始查找第一次出现指定的字符与字符串,如果没有找到则返回-1。
- Equals :确定两个String对象是否具有相同的值。String.Equals Method (System) | Microsoft Learn
- ToCharArray :将String实例中的字符复制到 Unicode 字符数组。
public char[] ToCharArray (); //返回值:一个 Unicode 字符数组(Char数组),其元素是该实例的各个字符。如果此实例是空字符串,则返回的数组为空且长度为零。 public char[] ToCharArray (int startIndex, int length); //startIndex:String实例中子字符串的起始位置。length:String实例中子字符串的长度。返回值:一个 Unicode 字符数组(Char数组),其元素是此实例中从字符位置 startIndex 开始的字符长度。
- Split:已指定的Unicode字符(Char)和字符串(string)对目标字符串进行分割。返回一个字符串数组; String.Split Method (System) | Microsoft Learn
- Join:已指定的Unicode字符(Char)和字符串(string)对目标字符串进行合并。返回一个字符串;String.Join Method (System) | Microsoft Learn
-
Format:根据指定的格式将对象值转换为字符串,并将其插入另一个字符串中。指定格式中的占位符只能小于或等于对应的对象值。
以object数组做参数:
Char
- ToUpperInvariant:(将字符装换为大写)返回使用不变区域性的大小写规则转换为大写的此 String 对象的副本。Char.ToUpperInvariant(Char) Method (System) | Microsoft Learn
string[] words = { "Tuesday", "Вторник", "Τρίτη" }; 转换为小写: tuesday Вторник Τρίτη
public static char ToUpperInvariant (char c); //返回值 :相当于参数c的大写字母,如果c已经是大写字母或不是字母,则是参数c。
- ToLowerInvariant:(将字符装换为小写)返回使用不变区域性的大小写规则转换为小写的此 String 对象的副本。Char.ToLowerInvariant(Char) Method (System) | Microsoft Learn
public static char ToLowerInvariant (char c); //返回值 :相当于参数c的小写字母,如果c已经是小写字母或不是字母,则是参数c。
System.Linq.Enumerable
- 公共方法 静态成员 All<TSource> 确定序列中的所有元素(TSource)是否满足条件。
- 公共方法 静态成员 Any<TSource>(IEnumerable<TSource>) 确定序列是否包含任何元素(TSource)。
- 公共方法 静态成员 Any<TSource>(IEnumerable<TSource>, Func<TSource, Boolean>) 确定序列中是否存在元素(TSource)满足条件。
使用 All与Any来判断一个集合中是否包含另一个集合:
questGuideTrackData是否包含_curTrackTaskIdList _curTrackTaskIdList.All(delegate(int i) { return questGuideTrackData.Any(i1 => i == i1); });//_curTrackTaskIdList中的全部元素是否都满足与questGuideTrackData中的任意元素相等*** 当集合是空集时,Any方法和All方***忽略条件判断语句,以空集的意义返回判断结果。即当集合为空集时:Any方法返回false,All方法返回true。
List<string> list = new List<string>(); bool b1 = list.All(c => false);//true bool b2 = list.All(c => true);//true bool b3 = list.Any(c => false);//false bool b4 = list.Any(c => true);//false
- 公共方法 静态成员 Cast<TResult> 将 IEnumerable 的元素强制转换为指定的类型(TResult)。
- 公共方法 静态成员 SequenceEqual(TSource)(IEnumerable(TSource), IEnumerable(TSource), IEqualityComparer(TSource)) 使用指定的 IEqualityComparer(T) 对两个序列的元素进行比较,以确定序列是否相等。
- 公共方法 静态成员 Where(TSource)(IEnumerable(TSource), Func(TSource, Boolean)) 基于谓词筛选值序列。 查找满足条件的元素
- 公共方法 静态成员 Where(TSource)(IEnumerable(TSource), Func(TSource, Int32, Boolean)) 基于谓词筛选值序列。 将在谓词函数的逻辑中使用每个元素的索引。 查找满足条件的元素
- 公共方法 静态成员 Concat<TSource> 连接两个序列。
- 公共方法 静态成员 Distinct<TSource>(IEnumerable<TSource>) 通过使用默认的相等比较器对值进行比较返回序列中的非重复元素。
- 公共方法 静态成员 SelectMany 具体用法: [C#] LINQ之SelectMany - cnxy - 博客园 (cnblogs.com)
- 返回最后一个位置的值: Last()
- 获取最小值:Min()
- 在序列的开头添加一个值:Prepend()
- Intersect() :通过使用默认的相等比较器来比较值,生成两个序列的交集。返回值:包含形成两个序列的集合交集的元素的序列。
- IOrderedEnumerable<Tsource>.ThenByDescending() :按降序对序列中的元素进行后续排序。您可以应用任意数量的 ThenBy(按升序对序列中的元素进行后续排序。) 或 ThenByDescending 方法来指定多个排序条件。
实例:
public class CaseInsensitiveComparer : IComparer<string> { public int Compare(string x, string y) { return string.Compare(x, y, true); } } public static void ThenByDescendingEx1() { string[] fruits = { "apPLe", "baNanA", "apple", "APple", "orange", "BAnana", "ORANGE", "apPLE" }; // Sort the strings first ascending by their length and // then descending using a custom case insensitive comparer. IEnumerable<string> query = fruits .OrderBy(fruit => fruit.Length)//返回值类型IOrderedEnumerable<TSource> .ThenByDescending(fruit => fruit, new CaseInsensitiveComparer()); foreach (string fruit in query) { Console.WriteLine(fruit); } } /* This code produces the following output: apPLe apple APple apPLE orange ORANGE baNanA BAnana */
- 求两个集合之间的交集:Enumerable.Intersect<TSource>(IEnumerable<Tsource> first,IEnumerable<TSource> second);异常:first或者second为空
- First<TSource>(this IEnumerable<TSoure> soure,Func<TSoure,Boolean> predicate) :返回第一个满足条件的元素;异常:source或者predicate为空。如果没有找到匹配的元素将会引发异常。要在未找到匹配元素时返回默认值,可以使用 FirstOrDefault 方法。
List<T>
List的底层实现:
当实例话List时如果没有给定容量(capacity)默认为长度为0的数组,否则以给定的容量为长度的数组。List的扩容核心操作是Array.copy方法,以新的容量重新创建一个数组,并将原始数据复制到新的数组中,最后将新数组的引用给老数组。
List的容量扩充是以4个空间起步(_defaultCapacity)之后都是*2的扩容。
实际代码:
List扩容后如何压缩(节省占用的内存空间)使用Add方法后将List的Count赋值给Capacity ;使Capacity与Count平齐,数组多余的虚占空间就给清掉了。
-
公共方法 Insert 将元素插入 List<T> 的指定索引处。
- 公共方法 FindAll (Predicate<T> match),参数:match:委托,用于定义要搜索的元素应满足的条件。(返回的集合的前后顺序与初始的前后顺序相同)
- 公共方法 CopyTo(T[]) 从目标数组的开头开始,将整个 List<T> 复制到兼容的一维数组(目标数组 T[])。
- 公共方法 CopyTo(T[], Int32) 从目标数组的指定索引处(Int32)开始,将整个 List<T> 复制到兼容的一维数组(目标数组 T[])。
- 公共方法 CopyTo(Int32,T[], Int32, Int32) 从目标数组的指定索引处(第二个Int32)开始,将元素的范围(第一个Int32表示索引,第三个Int32表示长度)从 List<T> 复制到兼容的一维数组。
一个 List<T> 的字符串创建并填充 5 个字符串。创建一个空字符串数组 15 个元素, 与 CopyTo(T[]) 方法重载可用于将列表的所有元素都复制到数组的第一个元素开始的数组。 CopyTo(T[], Int32) 方法重载可用于所有的元素复制到数组索引 6 开头数组列表 (将索引 5 留为空)。 最后, CopyTo(Int32,T[], Int32, Int32) 使用方法重载来复制从列表中,索引 2 开始的 3 个元素,使用到数组开头的数组索引 12 (将索引 11 留为空)。然后显示该数组的内容。 using System; using System.Collections.Generic; public class Example { public static void Main() { List<string> dinosaurs = new List<string>(); dinosaurs.Add("Tyrannosaurus"); dinosaurs.Add("Amargasaurus"); dinosaurs.Add("Mamenchisaurus"); dinosaurs.Add("Brachiosaurus"); dinosaurs.Add("Compsognathus"); Console.WriteLine(); foreach(string dinosaur in dinosaurs) { Console.WriteLine(dinosaur); } // Declare an array with 15 elements. string[] array = new string[15]; dinosaurs.CopyTo(array); dinosaurs.CopyTo(array, 6); dinosaurs.CopyTo(2, array, 12, 3); Console.WriteLine("\nContents of the array:"); foreach(string dinosaur in array) { Console.WriteLine(dinosaur); } } } /* This code example produces the following output: Tyrannosaurus Amargasaurus Mamenchisaurus Brachiosaurus Compsognathus Contents of the array: Tyrannosaurus Amargasaurus Mamenchisaurus Brachiosaurus Compsognathus Tyrannosaurus Amargasaurus Mamenchisaurus Brachiosaurus Compsognathus Mamenchisaurus Brachiosaurus Compsognathus */
- Clear() : 移除集合中的全部元素。List<T>.Clear Method (System.Collections.Generic) | Microsoft Learn
- Count 设置为 0,同时释放集合元素对其他对象的引用。但是list的容量不变;更改容量通过调用 TrimExcess 方法或直接设置 Capacity 属性。
- Find(Predicate<T> match) : 搜索与指定谓词定义的条件相匹配的元素,并返回整个 List<T> 中的第一个匹配项。
参数:Predicate<T>委托,它定义了要搜索的元素的条件。 返回值:匹配指定谓词定义的条件的第一个元素(如果找到);否则,类型 T 的默认值。异常情况:参数空异常:match=null
- AddRange : 将指定集合的元素添加到List<T>的末尾
Dictionary<TKey,TValue>
- TryAdd(Tkey key,TValue value):
参数:key:要添加的元素的键;value:要添加元素的值,可以为空
返回值:如果键值对被成功添加返回true;否则返回false.
与 Add 方法不同,如果字典中存在具有给定键的元素,此方法不会引发异常。与字典索引器不同,如果字典中存在具有给定键的元素,TryAdd 不会覆盖该元素。如果键已经存在,TryAdd 什么都不做并返回 false。
- GetValueOrDefault(Tkey key,TValue defaultValue):
参数:key:要获取的值的键;value:没有找到值时返回的默认值
返回值:如果找到对应键的值返回找到的值,如果没有找到返回设置的默认值。
Int32
-
TryParse(string s ,out int result);将数字的字符串表示转换为 32 位有符号整数。返回值表示操作是否成功。
当此方法返回时,如果转换成功,则包含与 s 中包含的数字等效的 32 位有符号整数值;如果转换失败,则包含零。如果 s 参数为 null 或 Empty、格式不正确或者表示的数字小于 Int32.MinValue 或大于 Int32.MaxValue,则转换将失败。该参数在未初始化的情况下传递;结果中最初提供的任何值都将被覆盖。如果 s 参数为 null 或 Empty、格式不正确或者表示的数字小于 Int32.MinValue 或大于 Int32.MaxValue,则转换将失败。 - ToString(IFormatProvider) 使用指定的区域性特定格式信息将此实例的数值转换为其等效的字符串表示形式。
IFormatProvider 参数:提供区域性特定的格式设置信息的对象。是实现IFormatProvider接口的对象。Int32.ToString 方法 (System) | Microsoft Learn
Enum
- GetHashCode() ;返回此实例值的哈希码。32 位有符号整数哈希码。
GetHashCode方法与获取Enum名称的方法做对比:
public enum CharachterSysSubTabType { Attributes_MenuMain = 0, Inventory_MenuMain = 1, Skill_MenuMain = 2, Pets_MenuMain = 3, } CharachterSysSubTabType sysSubTabType = CharachterSysSubTabType.Attributes_MenuMain; Console.WriteLine("----------Enum-------"); Console.WriteLine(sysSubTabType.GetHashCode()); // 打印结果: 0 Console.WriteLine(sysSubTabType);//打印结果:Attributes_MenuMain Console.WriteLine(sysSubTabType.ToString());//打印结果:Attributes_MenuMain Console.WriteLine(Enum.GetName(typeof(CharachterSysSubTabType),sysSubTabType));//打印结果:Attributes_MenuMain Console.WriteLine("----------Enum -- end -------");对应的IL:
// CharachterSysSubTabType charachterSysSubTabType = CharachterSysSubTabType.Attributes_MenuMain; IL_0944: ldc.i4.0 IL_0945: stloc.s 34 // Console.WriteLine("----------Enum-------"); IL_0947: ldstr "----------Enum-------" IL_094c: call void [System.Console]System.Console::WriteLine(string) // Console.WriteLine(charachterSysSubTabType.GetHashCode()); --打印结果: 0 IL_0951: nop IL_0952: ldloca.s 34 IL_0954: constrained. CharachterSysSubTabType IL_095a: callvirt instance int32 [System.Runtime]System.Object::GetHashCode() IL_095f: call void [System.Console]System.Console::WriteLine(int32) // Console.WriteLine(charachterSysSubTabType); --打印结果:Attributes_MenuMain IL_0964: nop IL_0965: ldloc.s 34 IL_0967: box CharachterSysSubTabType //装箱 IL_096c: call void [System.Console]System.Console::WriteLine(object) // Console.WriteLine(charachterSysSubTabType.ToString()); --打印结果:Attributes_MenuMain IL_0971: nop IL_0972: ldloca.s 34 IL_0974: constrained. CharachterSysSubTabType IL_097a: callvirt instance string [System.Runtime]System.Object::ToString() // 实例化一个String对象 IL_097f: call void [System.Console]System.Console::WriteLine(string) // Console.WriteLine(Enum.GetName(typeof(CharachterSysSubTabType), charachterSysSubTabType)); --打印结果:Attributes_MenuMain IL_0984: nop IL_0985: ldtoken CharachterSysSubTabType IL_098a: call class [System.Runtime]System.Type [System.Runtime]System.Type::GetTypeFromHandle(valuetype [System.Runtime]System.RuntimeTypeHandle) IL_098f: ldloc.s 34 IL_0991: box CharachterSysSubTabType //装箱 IL_0996: call string [System.Runtime]System.Enum::GetName(class [System.Runtime]System.Type, object) IL_099b: call void [System.Console]System.Console::WriteLine(string) // Console.WriteLine("----------Enum -- end -------"); IL_09a0: nop IL_09a1: ldstr "----------Enum -- end -------" IL_09a6: call void [System.Console]System.Console::WriteLine(string) // } IL_09ab: nop IL_09ac: ret其中 直接对枚举实例获取名称操作与通过Enum.GetName方法获取名称都进行了装箱操作。使用ToString方法没有装箱操作。
GetHashCode返回32 位有符号整数哈希码
Queue 队列
主要字段:
object[] _array 用于存储数据
int _head 存储队头位置,对应队列的第一个值
int _tail 存储队尾位置,对应队列的最后一个值
int _size 队列中数据的长度
int _head 存储队头位置,对应队列的第一个值
int _tail 存储队尾位置,对应队列的最后一个值
int _size 队列中数据的长度
int _growFactor 队列扩容时的增长因子
入队操作 :
源码:
public virtual void Enqueue(object obj) { if (this._size == this._array.Length) { int capacity = (int) ((long) this._array.Length * (long) this._growFactor / 100L); if (capacity < this._array.Length + 4) capacity = this._array.Length + 4; this.SetCapacity(capacity); } this._array[this._tail] = obj; this._tail = (this._tail + 1) % this._array.Length; ++this._size; ++this._version; }解读:
判断_size的值与数组_array长度是否相同
当_size的值与数组_array长度相同时 需要对_array数组扩容
在队尾的位置插入元素【_array[_tail]】,重置队尾值:队尾数据 _tail + 1后与数组长度取余(%); 队列长度_size加一
当_size的值与数组_array长度相同时 需要对_array数组扩容
在队尾的位置插入元素【_array[_tail]】,重置队尾值:队尾数据 _tail + 1后与数组长度取余(%); 队列长度_size加一
出队操作:
源码:
public virtual object Dequeue() { if (this.Count == 0) throw new InvalidOperationException("Queue empty."); object obj = this._array[this._head]; this._array[this._head] = (object) null; this._head = (this._head + 1) % this._array.Length; --this._size; ++this._version; return obj; }解读:
判断_array容量是否为0;
不为0:取队头的值【_array[_head]】,重置队头值:队头数据 _head + 1后与数组长度取余(%); 队列长度_size减一
不为0:取队头的值【_array[_head]】,重置队头值:队头数据 _head + 1后与数组长度取余(%); 队列长度_size减一
取队头元素:
源码:
public virtual object Peek() { if (this.Count == 0) throw new InvalidOperationException("Queue empty."); return this._array[this._head]; }解读:
判断_array容量是否为0;
不为0:取队头的值【_array[_head]】
不为0:取队头的值【_array[_head]】
判断某个值是否处于队列中:
public virtual bool Contains(object obj) { int index = this._head; int size = this._size; while (size-- > 0) { if (obj == null) { if (this._array[index] == null) return true; } else if (this._array[index] != null && this._array[index].Equals(obj)) return true; index = (index + 1) % this._array.Length; } return false; }
解读
从队头开始变量队列元素首先将队头位置(tempHead)和队列中数据的长度(tempSize)用临时变量储存,不能直接对原始数据做操作。
使用While循环查找:
循环条件:
每次循环tempSize减一 直到小于等于0;
循环体:
如果要查找的数据为空,并且_array[tempSize]的值也为空 返回true ,标记找到了元素。
如果要查找的数据不为空,获取_array[tempSize]的值与要找到值做比较,判断是否相同,相同就是找到了。
最后重置tempHead :tempHead + 1后与数组长度取余(%)
在循环体中还没找到则证明该值不存在与队列中
循环体:
如果要查找的数据为空,并且_array[tempSize]的值也为空 返回true ,标记找到了元素。
如果要查找的数据不为空,获取_array[tempSize]的值与要找到值做比较,判断是否相同,相同就是找到了。
最后重置tempHead :tempHead + 1后与数组长度取余(%)
在循环体中还没找到则证明该值不存在与队列中
获取元素:
internal object GetElement(int i) => this._array[(this._head + i) % this._array.Length];(索引为队列的索引 从 0 开始) 对头位置与要查找元素的索引和 与_array.Length 取余 获取对应_array数组的实际索引值。
Stack 栈
主要字段 :
object[] _array 用于存储数据
int _size 栈中数据的长度
进栈操作:
public virtual void Push(object obj) { if (this._size == this._array.Length) { object[] destinationArray = new object[2 * this._array.Length]; Array.Copy((Array) this._array, 0, (Array) destinationArray, 0, this._size); this._array = destinationArray; } this._array[this._size++] = obj; ++this._version; }解读:
判断_size的值与数组_array长度是否相同
当_size的值与数组_array长度相同时 需要对_array数组扩容
在_array[_size]中插入元素后 _size加一。
当_size的值与数组_array长度相同时 需要对_array数组扩容
在_array[_size]中插入元素后 _size加一。
出栈操作:
public virtual object Pop() { if (this._size == 0) throw new InvalidOperationException("Stack empty."); ++this._version; object obj = this._array[--this._size]; this._array[this._size] = (object) null; return obj; }解读:
_size是否为0,不为0:
取_size前一个元素:_array[--_size]并置空,因为_size表示数据长度,始终比_array中的索引值大一;
取栈顶元素:
public virtual object Peek() { return this._size != 0 ? this._array[this._size - 1] : throw new InvalidOperationException("Stack empty."); }解读:
_size不为0:取_size前一个元素_array[_size-1],否则报错。 不能使用 _size的自减操作,会对实际数值产生影响
判断某个值是否处于栈中:
public virtual bool Contains(object obj) { int size = this._size; while (size-- > 0) { if (obj == null) { if (this._array[size] == null) return true; } else if (this._array[size] != null && this._array[size].Equals(obj)) return true; } return false; }解读:
首先将栈中数据的长度(tempSize)用临时变量储存,不能直接对原始数据做操作。
使用While循环查找:
循环条件:
使用While循环查找:
循环条件:
每次循环tempSize减一 直到小于等于0;
循环体:
如果要查找的数据为空,并且_array[tempSize]的值也为空 返回true ,标记找到了元素。
如果要查找的数据不为空,获取_array[tempSize]的值与要找到值做比较,判断是否相同,相同就是找到了。
在循环体中还没找到则证明该值不存在与栈中
循环体:
如果要查找的数据为空,并且_array[tempSize]的值也为空 返回true ,标记找到了元素。
如果要查找的数据不为空,获取_array[tempSize]的值与要找到值做比较,判断是否相同,相同就是找到了。
在循环体中还没找到则证明该值不存在与栈中