C#第九章-泛型
1.List
List泛型的定义语法为:
List<T> 集合名=new List<T>(); //T可以是数据类型,也可以是类
泛型使用时必须实例化。
可以在其他地方实现T类型的实例化,然后使用Add方法将此实例加到集合里面。
属性:
Capacity
获取或设置该内部数据结构在不调整大小的情况下能够容纳的元素总数。
Count
获取 List<T> 中实际包含的元素数。
方法:
Add
将对象添加到 List<T> 的结尾处。
AddRange
将指定集合的元素添加到 List<T> 的末尾。
AsReadOnly
返回当前集合的只读 IList<T> 包装。
BinarySearch(T)
使用默认的比较器在整个已排序的 List<T> 中搜索元素,并返回该元素从零开始的索引。
BinarySearch(T, IComparer<T>)
使用指定的比较器在整个已排序的 List<T> 中搜索元素,并返回该元素从零开始的索引。
BinarySearch(Int32, Int32, T, IComparer<T>)
使用指定的比较器在已排序 List<T> 的某个元素范围中搜索元素,并返回该元素从零开始的索引。
Clear
从 List<T> 中移除所有元素。
Contains
确定某元素是否在 List<T> 中。
ConvertAll<TOutput>
将当前 List<T> 中的元素转换为另一种类型,并返回包含转换后的元素的列表。
CopyTo(T[])
将整个 List<T> 复制到兼容的一维数组中,从目标数组的开头开始放置。
Exists
确定 List<T> 是否包含与指定谓词所定义的条件相匹配的元素。
Find
搜索与指定谓词所定义的条件相匹配的元素,并返回整个 List<T> 中的第一个匹配元素。
FindIndex(Predicate<T>)
搜索与指定谓词所定义的条件相匹配的元素,并返回整个 List<T> 中第一个匹配元素的从零开始的索引。
ForEach
对 List<T> 的每个元素执行指定操作。
GetEnumerator
返回循环访问 List<T> 的枚举器。
IndexOf(T)
搜索指定的对象,并返回整个 List<T> 中第一个匹配项的从零开始的索引。
Insert
将元素插入 List<T> 的指定索引处。
InsertRange
将集合中的某个元素插入 List<T> 的指定索引处。
LastIndexOf(T)
搜索指定的对象,并返回整个 List<T> 中最后一个匹配项的从零开始的索引。
Remove
从 List<T> 中移除特定对象的第一个匹配项。
Reverse()
将整个 List<T> 中元素的顺序反转。
Sort()
使用默认比较器对整个 List<T> 中的元素进行排序。
代码示例 :
(1)创建及初始化:
[code]List<string> myList = new List<string>();//初始Capacity为0 List<string> myList2 = new List<string>(30); //初始Capacity为30 List<string> myList3 = new List<string>(new string[] { "1", "a", "2", "b" });//初始Capacity 为4,并且元素已被复制
(2)添加一个元素 List.Add(T item)
[code]film.Add("d");
(3)添加集合元素
[code]string[] Arr2 = {"f","g"."h"};mlist.AddRange(Arr2);
(4)在index位置添加一个元素 Insert(int index,T item)
[code]film.Insert(1,"p");
(5)遍历List中元素
[code]foreach(T element in mlist)T的类型与mlist声明时一样 { Console.WriteLine(element); }
(6)删除元素
[code]List.Remove(T item);//删除一个值 film.Remove("a"); List.RemoveAt(int index);//删除下标为index的元素 film.RemoveAt(0); List.RemoveRange(int index,int count);//下标index开始,删除count个元素 film.RemoveRange(3,2);
|
ArrayList |
List<T> |
不同点 |
可以添加任意类的元素 |
对添加的元素具有类型约束 |
添加时装箱,拆卸时拆箱 |
不需要装箱、拆箱操作 |
|
相同点 |
添加元素、删除元素,通过索引访问值的方式相同 |
[code]using System; using System.Collections.Generic;//使用泛型需要包含这个语句 namespace 泛型List { public class Student { private string name; private string number; private string score; public string Name { get => name; set => name = value; } public string Number { get => number; set => number = value; } public string Score { get => score; set => score = value; } } class Program { static void Main(string[] args) { //申请泛型 List<Student> students = new List<Student>(); //申请两个Student类 Student stu1 = new Student(); Student stu2 = new Student(); stu1.Name = "许嵩"; stu1.Number = "12345"; stu1.Score = "20"; stu2.Name = "薛之谦"; stu2.Number = "22345"; stu2.Score = "30"; 7ff7 //向泛型中添加类 students.Add(stu1); students.Add(stu2); //查看是否添加成功 Console.WriteLine("students里有{0}个元素", students.Count); //全部输出 foreach(Student stu in students) { Console.WriteLine("{0}\t{1}\t{2}", stu.Name, stu.Number, stu.Score); } Console.WriteLine(); Console.WriteLine("接下来删除薛之谦"); //删除语句 students.Remove(stu2); Console.WriteLine("students里有{0}个元素", students.Count); //再次遍历 foreach (Student stu in students) { Console.WriteLine("{0}\t{1}\t{2}", stu.Name, stu.Number, stu.Score); } Console.ReadKey(); } } }
2.Dictionary
1、从一组键(Key)到一组值(Value)的映射,每一个添加项都是由一个值及其相关连的键组成
2、任何键都必须是唯一的
3、键不能为空引用null(VB中的Nothing),若值为引用类型,则可以为空值
4、Key和Value可以是任何类型(string,int,custom class 等)
泛型集合Dictionary<Key,Value> Ps:Key和Value分别代表键和值的数据类型
Dictionary<K,V>的声明方式为 Dictionary<K,V> film = new Dictionary<K,V>();
该泛型与哈希表对应。
它们之间的对应关系和异同点如下图所示。
|
HashTable |
Dictionary |
不同点 |
可以添加任意类型的元素 |
对添加的元素具有类型约束 |
添加时装箱,拆卸时拆箱 |
不需要装箱、拆箱操作 |
|
相同点 |
添加元素、删除元素,通过键访问值的方式相 |
Dictionary常用的属性和方法:
- Compare :获取用于确定字典中的键是否相等
- Count :获取包含在Dictionary中的键/值对的数目
- Item :获取或设置与指定的键相关联的值
- Keys :获取包含在Dictionary中的键的值的集合
- Values :获取包含在Dictionary中的值的集合
- Add :将指定的键和值加入到字典中去
- Clear :移除字典中的所有值
- ContainsKey :查找Dictionary中有没有这个键
- ContainsKey :查找Dictionary中有没有这个值
- GetEnumerator :返回循环访问Dictionary的枚举数
- GetType :获取当前实例的Type。(从Object继承)
- Remove :从Dictionary中移除所指定的键 的 值(参数是键,操作的是值)
- ToString :返回表示当前Object 的 string(从Object继承)
- TryGetValue :获取与指定的键相关联的值
- KeyValuePari :同时存储键和值,常在foreach遍历时使用。
- TryGetValue :用于获取Dictionary中的键值,返回bool类型。
要获取值除了通过键获取外,还可以用一种叫做TryGetValue(key)的方法。该方法返回的是布尔类型,如果存在和键对应的值,那么就返回true,否则返回false,意义是避免了键没有对应值时发生的异常情况。
ContainsKey和ContainsValue表示查找集合中是否包含了对应的键和值,返回布尔类型,包含为true,不包含为false。
Add方法表示添加元素。
KeyCollection和ValueCollection表示键集合和值集合。
[code]using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 泛型dictionary { class Program { static void Main(string[] args) { //创建dictionary<K,V>对应哈希表,组成有键和值之分 Dictionary<string, string> film = new Dictionary<string, string>(); film.Add( "许嵩","帅哥1"); film.Add("薛之谦","帅哥2"); film.Add( "张宇","帅哥3"); Console.WriteLine("集合中现在的元素个数是{0}", film.Count); Console.WriteLine("分别是:"); foreach(KeyValuePair<string,string> kvp in film) { Console.WriteLine("\t{0}\t{1}", kvp.Key, kvp.Value); } film.Remove("薛之谦"); Console.WriteLine("集合中现在的元素个数是{0}", film.Count); Console.WriteLine("分别是:"); foreach (KeyValuePair<string, string> kvp in film) { Console.WriteLine("\t{0}\t{1}", kvp.Key, kvp.Value); } //检查元素是否存在,不存在的话添加 if(!film.ContainsKey("王琴")) { film.Add("王琴", "Hello!"); } if(!film.ContainsValue("Hi!")) { film.Add("王颖", "Hi!"); } //获取键的集合 Dictionary<string, string>.KeyCollection keys = film.Keys; Console.WriteLine("Key集合:"); foreach(string key in keys) { Console.WriteLine(key); } Console.WriteLine("\n值集合:"); //获取值的集合 Dictionary<string, string>.ValueCollection values = film.Values; foreach(string value in values) { Console.WriteLine(value); } //遍历元素可以和哈希表的方法一样 Console.WriteLine("\n哈希表式遍历元素方法"); foreach(string value in film.Values) { Console.WriteLine(value); } //利用键获取值 string horor = string.Empty; if (film.TryGetValue("许嵩", out horor))//此处必须要加out关键字,不然编译会报错 { Console.WriteLine("许嵩大大的头衔是{0}", horor); } else Console.WriteLine("许嵩没有头衔"); Console.ReadKey(); } } }
- c#2.0泛型学习(一)
- C# 2.0 泛型
- C#的泛型机制
- C# 泛型和其中的new 约束
- c# 技巧之 泛型方法
- C#读取数据库返回泛型集合(DataSetToList)
- C# List<T>用法 泛型 (转)
- More Effective C# Item1 : 使用1.x框架API的泛型版本
- c#中泛型表达式树备忘
- [读书笔记]C#学习笔记七: C#4.0中微小改动-可选参数,泛型的可变性
- C#中通过读取配置文件动态创建泛型对象
- 使用泛型集合模拟双色球开奖C#代码
- C#之数组、集合与泛型
- 【转载】C#中的泛型 (From dotNet SDK 2.0 Beta1)
- C#通过反射创建自定义泛型
- C# 2.0 Specification(泛型五)
- c# 集合 数组 泛型
- 按自己的想法去理解事件和泛型(C#)
- lwj_C#_泛型使用
- C#基础:泛型的接口抽象