这里主要讲几个重要的STL在C#中的应用:vector, map, hash_map, queue, set, stack, list.
vector: 在C#中换成了list
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace test2 7 { 8 class Program 9 { 10 static void Main(string[] args) 11 { 12 Person p1 = new Person("zhangsan", 30); 13 Person p2 = new Person("lisi", 20); 14 Person p3 = new Person("wangwu", 50); 15 List<Person> persons = new List<Person>(); 16 persons.Add(p1); 17 persons.Add(p2); 18 persons.Add(p3); 19 //能直接访问index 20 Console.WriteLine(persons[1].Name); 21 //sort方法1 22 persons.Sort(); 23 foreach (Person p in persons) 24 { 25 Console.WriteLine(p.Name); 26 } 27 //sort方法2 28 persons.Sort(NameComparer.Default); 29 foreach (Person p in persons) 30 { 31 Console.WriteLine(p.Name); 32 } 33 //sort方法3 34 System.Comparison<Person> NameComparison = new System.Comparison<Person>(PersonComparison.Name); 35 persons.Sort(NameComparison); 36 foreach (Person p in persons) 37 { 38 Console.WriteLine(p.Name); 39 } 40 //search 41 System.Predicate<Person> MidAgePredicate = new System.Predicate<Person>(PersonPredicate.MidAge); 42 List<Person> MidAgePersons = persons.FindAll(MidAgePredicate); 43 foreach (Person p in MidAgePersons) 44 { 45 Console.WriteLine(p.Name); 46 } 47 //Persons集合 48 Persons PersonCol = new Persons(); 49 PersonCol.Add(p1); 50 PersonCol.Add(p2); 51 PersonCol.Add(p3); 52 Console.WriteLine(PersonCol.GetAllNames()); 53 Console.ReadKey(); 54 } 55 } 56 class Person : IComparable<Person> 57 { 58 private string _name; 59 private int _age; 60 public Person(string Name, int Age) 61 { 62 this._age = Age; 63 this._name = Name; 64 } 65 public string Name 66 { 67 get { return _name; } 68 } 69 public int Age 70 { 71 get { return _age; } 72 } 73 public int CompareTo(Person p) 74 { 75 return this.Age - p.Age; 76 } 77 } 78 class NameComparer : IComparer<Person> 79 { 80 public static NameComparer Default = new NameComparer(); 81 public int Compare(Person p1, Person p2) 82 { 83 return System.Collections.Comparer.Default.Compare(p1.Name, p2.Name); 84 } 85 } 86 class PersonComparison 87 { 88 public static int Name(Person p1, Person p2) 89 { 90 return System.Collections.Comparer.Default.Compare(p1.Name, p2.Name); 91 } 92 } 93 class PersonPredicate 94 { 95 public static bool MidAge(Person p) 96 { 97 return p.Age >= 40; 98 } 99 } 100 class Persons : List<Person> 101 { 102 public string GetAllNames() 103 { 104 if (this.Count == 0) return ""; 105 string val = ""; 106 foreach (Person p in this) 107 { 108 val += p.Name + ","; 109 } 110 return val.Substring(0, val.Length - 1); 111 } 112 } 113 }
还可以参考http://www.cnblogs.com/yingzhongwen/archive/2013/04/09/3010182.html
list没有赋初值的方法,只能new一个出来,再不停地Add...而数组是有初始值的,但不能给它赋特别的初始值,int的初始值为0,bool为false
List的方法和属性
Capacity 用于获取或设置List可容纳元素的数量。当数量超过容量时,这个值会自动增长。
Count 属性,用于获取数组中当前元素数量
Item( ) 通过指定索引获取或设置元素。对于List类来说,它是一个索引器。
Add( ) 在List中添加一个对象的公有方法
AddRange( ) 公有方法,在List尾部添加实现了ICollection接口的多个元素
BinarySearch( ) 重载的公有方法,用于在排序的List内使用二分查找来定位指定元素.
Clear( ) 在List内移除所有元素
Contains( ) 测试一个元素是否在List内
CopyTo( ) 重载的公有方法,把一个List拷贝到一维数组内, 注意这里是List.CopyTo(int[]); List之间的深拷贝只能是List<int> tmp = new List<int>(tmp1.ToArray());
Exists( ) 测试一个元素是否在List内(跟Contains有啥区别。。。)
Find( ) 查找并返回List内的出现的第一个匹配元素
FindAll( ) 查找并返回List内的所有匹配元素
GetEnumerator( ) 重载的公有方法,返回一个用于迭代List的枚举器
Getrange( ) 拷贝指定范围的元素到新的List内
IndexOf( ) 重载的公有方法,查找并返回每一个匹配元素的索引
Insert( ) 在List内插入一个元素, Insert(int index, T tmp);
InsertRange( ) 在List内插入一组元素
LastIndexOf( ) 重载的公有方法,,查找并返回最后一个匹配元素的索引
Remove( ) 移除与指定元素匹配的第一个元素
RemoveAt( ) 移除指定索引的元素
RemoveRange( ) 移除指定范围的元素
Reverse( ) 反转List内元素的顺序
Sort( ) 对List内的元素进行排序
ToArray( ) 把List内的元素拷贝到一个新的数组内
trimToSize( ) 将容量设置为List中元素的实际数目
map: 在C#中换成了directory,基本跟map用法差不多
1 Dictionary<string, string> pList = new Dictionary<string, string>(); 2 pList.Add("zhangsan", "40"); 3 string s = "d"; 4 pList.TryGetValue("zhangsan", out s); 5 Console.WriteLine("{0}", s); 6 if (pList.ContainsKey("zhangsan")) 7 Console.WriteLine("pList containsKey zhangsan"); 8 if (pList.ContainsValue("40")) 9 Console.WriteLine("pList containsValue 40"); 10 Console.WriteLine(pList.Count); 11 foreach (var dic in pList) 12 { 13 Console.WriteLine("Output : Key : {0}, Value : {1}", dic.Key, dic.Value); 14 } 15 pList.Remove("zhangsan");
hash_map: C#没有这个东西
queue:C#还是叫Queue
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace test2 7 { 8 class Program 9 { 10 static void Main(string[] args) 11 { 12 Queue<string> que = new Queue<string>(); 13 que.Enqueue("zhangsan"); 14 que.Enqueue("lisi"); 15 que.Enqueue("wangwu"); 16 Console.WriteLine("Count: {0}", que.Count); 17 Console.WriteLine("Queue values: "); 18 PrintValues(que); 19 Console.WriteLine("(Dequeue)\t{0}", que.Dequeue()); 20 Console.WriteLine("Queue values: "); 21 PrintValues(que); 22 Console.WriteLine("(peek) \t{0}", que.Peek()); 23 Console.WriteLine("Queue values: "); 24 PrintValues(que); 25 Console.ReadKey(); 26 } 27 public static void PrintValues(IEnumerable<string> myCollection) 28 { 29 foreach (Object obj in myCollection) 30 { 31 Console.WriteLine(" {0}", obj); 32 } 33 } 34 } 35 }
set: C#叫HashSet
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace test2 7 { 8 class Program 9 { 10 static void Main(string[] args) 11 { 12 HashSet<string> set = new HashSet<string>(); 13 set.Add("zhangsan"); 14 set.Add("lisi"); 15 set.Add("wangwu"); 16 if (set.Contains("zhangsan")) 17 Console.WriteLine("set contans zhangsan"); 18 Console.WriteLine(set.Count); 19 set.Remove("zhangsan"); 20 if (set.Contains("zhangsan")) 21 Console.WriteLine("set contans zhangsan"); 22 Console.WriteLine(set.Count); 23 foreach (var s in set) 24 Console.WriteLine("{0}", s); 25 set.Clear(); 26 Console.WriteLine(set.Count); 27 } 28 } 29 }
stack: C#还是叫stack(遵照set)
stack.Push();
stack.Pop();
stack.Peek();
list: C#就是list
string:
string是readonly的,要修改某一个字符就得先转成char[],再转回来
char[] sh = str.ToArray();
sh[3] = 'a';
str = new string(sh);
string s = "hello world";
1. bool b1 = s.Contains("hello");
2. 定位
2.1 IndexOf/LastIndexOf
int IndexOf(char value);
int IndexOf(char value, int startIndex);
int IndexOf(char value, int startIndex, int count);
int IndexOf(string value);
int IndexOf(string value, int startIndex);
int IndexOf(string value, int startIndex, int count);
2.2 IndexOfAny/LastIndexOfAny
int IndexOfAny(char[] anyof);
int IndexOfAny(char[] anyof, int startIndex);
int IndexOfAny(char[] anyof, int startIndex, int count);
LastIndexOfAny跟2.1类似
最后补充一下数组
int[,] f = new int[3, 5]; //声明一个3行5列的int数组
int m = f.GetLength(0); //获得行数
int n = f.GetLength(1); //获得列数
二维数组在函数里以一维作为参数时,C#没有办法用f[i]这种形式,只能传进f和行号,这确实比较麻烦