C#中泛型的使用

命名空间: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-11-25 08:35:49

C#中泛型的使用的相关文章

[转]:Delphi XE中泛型数组的使用范例

Delphi XE中泛型数组的使用范例,下面的范例简单的使用了泛型字符串数组,如用 TArray 代替 array of Word, 还可以使用 TArray 类提供的算法(就是少了点). uses Generics.Collections, Generics.Defaults; {测试 TArray 的 Sort 方法} procedure TForm1.Button1Click(Sender: TObject); var arr: TArray<string>; //同 array of

Java 中 泛型的限定

泛型 一般 出现在集合中,迭代器中 也会出现! 泛型 是为了 提高代码的 安全性. 泛型 确保数据类型的唯一性. 在我们常用的容器中,  越是 单一 约好处理啊! 泛型的限定: ? 是通配符 指代 任意类型 泛型的限定上限: <? extends E> 接受 E 或者 E 的子类型. 泛型的限定下限: <?  super   E>  接收  E 或者 E 的父类. 泛型的限定上限 (定义父类 填装子类 类型!) 代码: package stu.love.v; import java

Java中泛型 使用

泛型: 1.5  之后出现  提高安全 1      泛型 确定 集合容器的类型. 2      <> 接收一种数据类型,(引用数据类型) ArrayList<String> lis = new ArrayList<String>() 目的: 将运行时期的 错误 转化到 编译时期,提高了安全性! 3      不需要 强制类型转换.  更加安全! 泛型的 擦除: 泛型在编译时期使用!使用完毕直接擦除. 编译完的时候 不存在 泛型. 好处: 使用了 泛型,不自需要强制类型

Java中泛型 类型擦除

转自:Java中泛型是类型擦除的 Java 泛型(Generic)的引入加强了参数类型的安全性,减少了类型的转换,但有一点需要注意:Java 的泛型在编译器有效,在运行期被删除,也就是说所有泛型参数类型在编译后都会被清除掉,看下面一个列子,代码如下: public class Foo { public void listMethod(List<String> stringList){ } public void listMethod(List<Integer> intList) {

java中泛型上限,下限应用

import java.util.*; class Person implements Comparable<Person>{ String name; int age; Person(){ name = ""; age = 0; } Person(String name, int age){ this.name = name; this.age = age; } public String toString(){ return name + "...."

Java中泛型区别以及泛型擦除详解

一.引言 复习javac的编译过程中的解语法糖的时候看见了泛型擦除中的举例,网上的资料大多比较散各针对性不一,在此做出自己的一些详细且易懂的总结. 二.泛型简介 泛型是JDK 1.5的一项新特性,一种编译器使用的范式,语法糖的一种,能保证类型安全.[注意:继承中,子类泛型数必须不少于父类泛型数] 为了方便理解,我将泛型分为普通泛型和通配泛型 三.泛型分类 1.普通泛型 就是没有设置通配的泛型,泛型表示为某一个类. 声明时: class Test<T>{...} 使用时: Test<Int

C#中泛型容器Stack&lt;T&gt;的用法,以及借此实现&rdquo;撤销/重做&rdquo;功能

.Net为我们提供了众多的泛型集合.比如,Stack<T>先进后出,Queue<T>先进先出,List<T>集合元素可排序,支持索引,LinkedList<T>,双向链表的泛型实现,不支持索引;ISet<T>不允许被复制,他有2个实现,一个是HashSet<T>,不维持集合元素的排序,另一个是SortedSet<T>,支持集合元素的排序;IDictionary<TKey, TValue>是一个字典集合的泛型接口

C++中泛型使用导致的膨胀问题如何解决?

本文和大家分享的主要是c++开发中,泛型使用导致的膨胀问题的解决,希望对大家有所帮助. 如下定义两个list,元素类型不同: list<int> l1;listl2; 如果是用C语来做应该怎么办?它会对应list写一套代码,再对list写一套.每套都有相同的成员函数,只是变量类型各自不同罢了. 下面是list的C语言实现方式: //! code-1struct list_int_item { int value; struct list_int_item *next; }; struct li

Java中泛型的协变

在工作中遇到一个问题,用代码描述如下: package test; import java.util.LinkedList; import java.util.List; public class ListTest {     public void func(List<Base> list) {     }     public static void main(String args[]) {         ListTest lt = new ListTest();         Li