C# 语言中泛型集合是泛型中最常见的应用,主要用于约束集合中存放的元素。由于在集合中能存放任意类型的值,在取值时经常会遇到数据类型转换异常的情况,因此推荐在定义集合时使用泛型集合。
前面《C# ArrayList》与《C# Hashtable》中已经介绍了非泛型集合中的 ArrayList、Hashtable。
非泛型集合中的 ArrayList、Hashtable 在泛型集合中分别使用 List<T> 和 Dictionary<K,V> 来表示,其他泛型集合均与非泛型集合一致。
List所属命名空间using System.Collections.Generic; 继承于IList<T>接口,如下图所示:
List<T>类是 ArrayList 类的泛型等效类。该类使用大小可按需动态增加的数组实现 IList<T> 泛型接口。
泛型的好处: 它为使用C#语言编写面向对象程序增加了极大的效力和灵活性。不会强行对值类型进行装箱和拆箱操作,或对引用类型进行向下强制类型转换,因此性能得到提高。
性能注意事项:
在决定使用IList<T> 还是使用ArrayList类(两者具有类似的功能)时,记住IList<T> 类在大多数情况下执行得更好并且是类型安全的。
如果对IList<T> 类的类型 T 使用引用类型,则两个类的行为是完全相同的。但是,如果对类型 T 使用值类型,则需要考虑实现和装箱问题。
添加到 ArrayList 中的任何引用或值类型都将隐式地向上强制转换为 Object。如果项是值类型,则必须在将其添加到列表中时进行装箱操作,在检索时进行取消装箱操作。
强制转换以及装箱和拆箱操作都会降低性能;在必须对大型集合进行循环访问的情况下,装箱和取消装箱的影响非常明显。
怎样创建泛型集合?
利用System.Collections.Generic命名空间下面的List<T>泛型类创建集合,语法如下:
List<T> ListOfT = new List<T>();
其中的"T"就是所要使用的类型,既可以是简单类型,如string、int,也可以是用户自定义类型。
List的方法和属性的作用
方法或属性 | 作用 |
---|---|
Capacity |
用于获取或设置List可容纳元素的数量。当数量超过容量时,这个值会自动增长。您可以设置这个值以减少容量。 |
Count | 用于获取数组中当前元素数量 |
Item( ) | 通过指定索引获取或设置元素。对于List类来说,它是一个索引器。 |
Add( ) | 添加一个对象到List<T>的结尾处 |
AddRange( ) | 将指定集合元素添加到List<T>的末尾处 |
BinarySearch( ) | 使用指定的比较器在已排序List<T>的某个元素范围中搜索元素,并返回该元素从零开始的索引。 |
Clear( ) | 从List<T>中移除所有元素 |
Contains( ) | 判断某元素是否在List<T>内 |
CopyTo( ) | 把一个List<T>拷贝到一维数组内 |
Exists( ) | 确定List<T>是否包含与指定谓词定义的条件匹配的元素。 |
Find( ) | 查找并返回List<T>内的出现的第一个匹配元素 |
FindAll( ) | 查找并返回List<T>内的所有匹配元素 |
GetEnumerator( ) | 返回循环访问List<T>的枚举数。 |
GetRange( ) | 拷贝指定范围的元素到新的List<T>内 |
IndexOf( ) | 查找指定的对象,并返回整个List<T>中第一个匹配项的从零开始的索引。 |
Insert( ) | 将元素插入List<T>的指定索引处。 |
InsertRange( ) | 将集合中的元素插入List<T>的指定索引处。 |
LastIndexOf( ) | 查找指定对象并返回整个List<T>中最后一个匹配项的从零开始索引。 |
Remove( ) | 从List<T>中移除特定对象的第一个匹配项。 |
RemoveAt( ) | 移除List<T>的指定索引处的元素。 |
RemoveRange( ) | 移除指定范围的元素 |
Reverse( ) | 反转List<T>内元素的顺序 |
Sort( ) | 对List<T>内的元素进行排序 |
ToArray( ) | 将List<T>内的元素拷贝到一个新的数组中 |
TrimExcess( ) | 将容量设置为List<T>中元素的实际数目(如果该数目小于某个阈值)。 |
代码示例:
using System; using System.Collections.Generic; //引用命名空间 namespace ConsoleApp { class Program { static void Main(string[] args) { //创建泛型集合对象 List<string> list = new List<string>(); //添加一个元素 list.Add("张三"); list.Add("李四"); list.Add("王五"); //添加一组元素 list.AddRange(new string[] { "韩梅梅","李雷","沈婷","张丽" }); list.AddRange(list); //在index位置插入一个元素 list.Insert(0, "岳云鹏"); //删除指定的第一个元素 list.Remove("韩梅梅"); //删除下标为index的元素 list.RemoveAt(4); //从下标index开始,删除count个元素 list.RemoveRange(0,1); //给List里面元素排序 list.Sort(); //默认是元素第一个字母按升序 //给List里面元素顺序反转 list.Reverse(); //判断某个元素是否在该List中 if (list.Contains("岳云鹏")) { Console.WriteLine("岳云鹏在这"); } else { Console.WriteLine("岳云鹏不在这"); } //清空 list.Clear(); //获得List中元素数目 Console.WriteLine(list.Count); //转换为数组 string[] strArr = list.ToArray(); //遍历输出 for (int i = 0; i < list.Count; i++) { Console.WriteLine(list[i]); } Console.ReadKey(); } } }
文章评论