asp.net C#中泛型的使用详解

作者:袖梨 2022-06-25


一、List命名空间:

System.Collections.Generic(程序集:mscorlib)
二、List描述: 
1)、表示可通过索引访问的对象的强类型列表;提供用于对列表进行搜索、排序和操作的方法。 2)、是ArrayList类的泛型等效类。 3)、可以使用一个整数索引访问此集合中的元素;索引从 零 开始。 4)、可以接收null空引用(VB中的Nothing)。 5)、允许重复元素
 
三、List构造函数
 
名称 说明
List() 初始化 List 类的新实例,该实例为空并且具有默认初始容量(0)。
List(IEnumerable) 初始化 List 类的新实例,该实例包含从指定集合复制的元素并且具有足够的容量来容纳所复制的元素。
List(Int32) 始化 List 类的新实例,该实例为空并且具有指定的初始容量。
说明:默认向 List 添加元素时,将通过重新分配内部数组,根据需要自动增大容量。如果可以估计集合的大小,那么当指定初始容量后,将无需在向 List 中添加元素时执行大量的大小调整操作。这样可提高性能。
 
四、List属性
 
名称 说明
Capacity 获取或设置该内部数据结构在不调整大小的情况下能够容纳的元素总数。
Count 获取 List 中实际包含的元素数。
 说明:Capacity 是 List 在需要调整大小之前可以存储的元素数,Count 则是 List 中实际存储的元素数。
 
五、List方法

 
名称 说明

Add 将对象添加到 List 的结尾处。
AddRange 将指定集合的元素添加到 List 的末尾。
AsReadOnly 返回当前集合的只读 IList 包装。
BinarySearch(T) 使用默认的比较器在整个已排序的 List 中搜索元素,并返回该元素从零开始的索引。
BinarySearch(T, IComparer) 使用指定的比较器在整个已排序的 List 中搜索元素,并返回该元素从零开始的索引。
BinarySearch(Int32, Int32, T, IComparer) 使用指定的比较器在已排序 List 的某个元素范围中搜索元素,并返回该元素从零开始的索引。
Clear 从 List 中移除所有元素。
Contains 确定某元素是否在 List 中。
ConvertAll 将当前 List 中的元素转换为另一种类型,并返回包含转换后的元素的列表。
CopyTo(T[]) 将整个 List 复制到兼容的一维数组中,从目标数组的开头开始放置。
Exists 确定 List 是否包含与指定谓词所定义的条件相匹配的元素。
Find 搜索与指定谓词所定义的条件相匹配的元素,并返回整个 List 中的第一个匹配元素。
FindIndex(Predicate) 搜索与指定谓词所定义的条件相匹配的元素,并返回整个 List 中第一个匹配元素的从零开始的索引。
ForEach 对 List 的每个元素执行指定操作。
GetEnumerator 返回循环访问 List 的枚举器。
IndexOf(T) 搜索指定的对象,并返回整个 List 中第一个匹配项的从零开始的索引。
Insert 将元素插入 List 的指定索引处。
InsertRange 将集合中的某个元素插入 List 的指定索引处。
LastIndexOf(T) 搜索指定的对象,并返回整个 List 中最后一个匹配项的从零开始的索引。
Remove 从 List 中移除特定对象的第一个匹配项。
Reverse() 将整个 List 中元素的顺序反转。
Sort() 使用默认比较器对整个 List 中的元素进行排序。
TrimExcess 将容量设置为 List 中的实际元素数目(如果该数目小于某个阈值)。
TrueForAll 确定是否 List 中的每个元素都与指定的谓词所定义的条件相匹配。
说明:上述方法说明中有用到“谓词”,谓词就是Predicate 委托,它代表一组方法,该方法定义一组条件,并确定指定的参数对象是否符合这些条件,具体的参见示例程序。

命名空间:using System.Collections.Generic;

普通数组:在声明时必须制定数组的长度和数据类型;ArrayList:数组元素数据类型和长度不受限制,但效率稍微低些;泛型:类似于数组功能,其长度不受限制,数据类型在声明时必须指定。

C#中预定义了集中常用的泛型类,如:List、Dictionary、Queue等等

1. List

语法:
List<类型> 变量 = new List<类型>();
List<类型> 变量 = new List<类型> { XXX, XXX, XXX}; // 声明并初始化
示例1:简单实用:声明、初始化、赋值、读取等操作。在下例中可以看出,变量list1可以任意的添加元素,长度不受限制。

// 声明方式1
List list1 = new List();
list1.Add(211);
list1.Add(985);

// 声明方式2
List list2 = new List { 211, 985 };
list2.Add(136);

for (int i = 0; i < list2.Count; i++)
{
    Console.Write(list2[i].ToString());
}
2. Dictionary

上例中泛型变量list1中存储的元素是Int类型的变量,而在实际的应用当中往往要比这更加复杂。Dictionary泛型类为C#预定义的泛型类,它所存储的每个元素由一对{key:value}两个变量组成。

每个元素可以理解为一行记录,Key为主键,必须唯一,可以为Int、String等类型。
Value项可以为任意类型,可以是Int、String、数组等,也可以是实例化的对象。
① 简单使用

class Program
{       
    static void Main(string[] args)
    {
        // 实例化三个User对象
        User user1 = new User("李宁", 21);
        User user2 = new User("耐克", 42);
        User user3 = new User("阿迪", 31);

        // 声明Dictionary泛型变量users
        // Key的类型为Int;Value的类型为User
        Dictionary users = new Dictionary();

        // 向users添加“元素”,“元素”的key不能重复
        users.Add(2, user1);
        users.Add(3, user2);
        users.Add(5, user3);

        // 循环遍历每个“元素”
        foreach (var p in users)
        {
            Console.Write(p.Key);
            Console.Write(p.Value.name);
            Console.Write(p.Value.age);
        }

        // 直接遍历元素的Values
        foreach (User u in users.Values)
        {
            Console.Write(u.name);
            Console.Write(u.age);
        }
    }
}
// User类
class User
{
    public string name;     // 姓名
    public int age;         // 年龄
    public User(string name, int age)
    {
        this.name = name;
        this.age = age;
    }
}
② 作为参数使用

class Program
{
    static void Main(string[] args)
    {
        User user1 = new User("李宁", 21);
        User user2 = new User("耐克", 42);
        User user3 = new User("阿迪", 31);
       
        Dictionary users = new Dictionary();
        users.Add(2, user1);
        users.Add(3, user2);
        users.Add(5, user3);
               
        Program.show(users);    // 将泛型变量作为函数参数使用
    }
    // 注意参数类型的书写格式
    static void show(Dictionary list)
    {
        foreach (var p in list)
        {
            Console.Write(p.Key);
            Console.Write(p.Value.name);
            Console.Write(p.Value.age);
        }       
    }
}
class User
{
    public string name;     // 姓名
    public int age;         // 年龄
    public User(string name, int age)
    {
        this.name = name;
        this.age = age;
    }
}

相关文章

精彩推荐