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

一、List<T>命名空间:

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

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

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

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

1. List<T>

语法:
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<TKey, TValue>

上例中泛型变量list1中存储的元素是Int类型的变量,而在实际的应用当中往往要比这更加复杂。Dictionary<Tkey, TValue>泛型类为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<int, User> users = new Dictionary<int, User>();

        // 向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<int, User> users = new Dictionary<int, User>();
        users.Add(2, user1);
        users.Add(3, user2);
        users.Add(5, user3);
               
        Program.show(users);    // 将泛型变量作为函数参数使用
    }
    // 注意参数类型的书写格式
    static void show(Dictionary<int, User> 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;
    }
}

时间: 2024-12-02 22:43:15

asp.net C#中泛型的使用详解的相关文章

ASP.NET MVC中使用DropDownList地详解

在ASP.NET MVC中,尽管我们可以直接在页面中编写HTML控件,并绑定控件的属性,但更方便的办法还是使用HtmlHelper中的辅助方法.在View中,包含一个类型为HtmlHelper的属性Html,它为我们呈现控件提供了捷径.   我们今天主要来讨论Html.DropDownList的用法,首先从Html.TextBox开始. Html.TextBox有一个重载方法形式如下: public static string TextBox(this HtmlHelper htmlHelper

C#各个版本中的新增特性详解

原文:C#各个版本中的新增特性详解 序言 自从2000年初期发布以来,c#编程语言不断的得到改进,使我们能够更加清晰的编写代码,也更加容易维护我们的代码,增强的功能已经从1.0搞到啦7.0甚至7.1,每一次改过都伴随着.NET Framework库的相应支持,也不断的带给我们期待与惊喜.下面我们就对c#一路走到现在,做一个回顾与学习. C#语言目标与前行 c#的设计目标是有以下几点: 旨在是一种简单,现代,通用的面向对象编程语言. 语言及其实现应该为软件工程原理提供支持,例如强类型检查,数组维度

PHP也能干大事之PHP中的编码解码详解

PHP也能干大事之PHP中的编码解码详解        这篇文章主要介绍了PHP也能干大事之PHP中的编码解码详解,本文讲解了ASCII编解码.URL编解码.Base64编解码.HTML实体编解码.二进制.八进制.十进制.十六进制相互转换等内容,需要的朋友可以参考下 写在前面 PHP也能干大事是我总结的PHP语法特性及相关函数类库的经典用法,并不一定是真正能实现四两拨千斤的功效,但是掌握这些方法,可以在你的工作和学习上有一些帮助,希望大家能集思广益,将<PHP也能干大事>丰富得更精彩!转载请注

Android中Service(后台服务)详解

  这篇文章主要介绍了Android中Service(后台服务)详解,本文讲解了Service的概念.作用.生命周期.启动方式和代码实例等内容,需要的朋友可以参考下 1.概念: (1).Service可以说是一个在后台运行的Activity.它不是一个单独的进程,它只需要应用告诉它要在后台做什么就可以了. (2).它要是实现和用户的交互的话需要通过通知栏或者是通过发送广播,UI去接收显示. (3).它的应用十分广泛,尤其是在框架层,应用更多的是对系统服务的调用. 2.作用: (1).它用于处理一

Excel表格中视图功能相关详解

  Excel表格中视图功能相关详解          一.同时查看两个excel文件 打开两个excel文件 视图 - 全部重排 - 垂直/水平并排 二.同时查看同一个excel文件的两个excel工作表 视图 - 新建窗口 - 全部重排 - 垂直/水平并排 三.同时查看同一个表的两个不同区域 1.第一行不动(向下翻看excel表时,让一个表格的第一行固定不动) 视图 - 冻结窗格 - 冻结首行 2.同时查看两个动态区域 选取某一行 - 视图 - 拆分,可以把界面拆分成上下两部分,和冻结不同的

JavaScript中的Promise使用详解

  这篇文章主要介绍了JavaScript中的Promise使用详解,promise对象是JS进阶学习中的重要知识点,需要的朋友可以参考下 许多的语言,为了将异步模式处理得更像平常的顺序,都包含一种有趣的方案库,它们被称之为promises,deferreds,或者futures.JavaScript的promises ,可以促进关注点分离,以代替紧密耦合的接口. 本文讲的是基于Promises/A 标准的JavaScript promises.[http://wiki.commonjs.org

Linux bash Shell中的变量类型详解

  这篇文章主要介绍了Linux bash Shell中的变量类型详解,变量类型共分为本地变量.局部变量.环境变量.位置变量和特殊变量等,需要的朋友可以参考下 在Linux系统中进行日常运维或者是编写脚本时,变量是再熟悉不过的了,但这些变量都有哪些类型,具体的用法又有哪些差异呢?本文整理分享给大家: 一.bash变量类型: 本地变量 局部变量 环境变量 位置变量 特殊变量(内置) 二.本地变量: varname=value:作用域为整个bash进程可以使用; 变量命名规范: 1. 只能含字母.数

Python中的下划线详解

  这篇文章主要介绍了Python中的下划线详解,本文讲解了单个下划线直接做变量名.单下划线前缀的名称.双下划线前缀的名称等内容,需要的朋友可以参考下 这篇文章讨论Python中下划线_的使用.跟Python中很多用法类似,下划线_的不同用法绝大部分(不全是)都是一种惯例约定. 一. 单个下划线直接做变量名(_) 主要有三种情况: 1. 解释器中 _符号是指交互解释器中最后一次执行语句的返回结果.这种用法最初出现在CPython解释器中,其他解释器后来也都跟进了. 代码如下: >>> _

Python中的默认参数详解

  这篇文章主要介绍了Python中的默认参数详解,本文讲解了默认参数的基本原理.如何正确地使用可变参数等内容,需要的朋友可以参考下 文章的主题 不要使用可变对象作为函数的默认参数例如 list,dict,因为def是一个可执行语句,只有def执行的时候才会计算默认默认参数的值,所以使用默认参数会造成函数执行的时候一直在使用同一个对象,引起bug. 基本原理 在 Python 源码中,我们使用def来定义函数或者方法.在其他语言中,类似的东西往往只是一一个语法声明关键字,但def却是一个可执行的