• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > C#泛型实例详解

C#泛型实例详解

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c#泛型详解,c#泛型实例,c#泛型,c#泛型编程,c#泛型集合等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

本文以实例形式讲述了C#泛型的用法,有助于读者深入理解C#泛型的原理,具体分析如下:

首先需要明白什么时候使用泛型:

当针对不同的数据类型,采用相似的逻辑算法,为了避免重复,可以考虑使用泛型。

一、针对类的泛型

针对不同类型的数组,写一个针对数组的"冒泡排序"。

1.思路

● 针对类的泛型,泛型打在类旁。
● 由于在"冒泡排序"中需要对元素进行比较,所以泛型要约束成实现IComparable接口。

  class Program
  {
    static void Main(string[] args)
    {
      SortHelper<int> isorter = new SortHelper<int>();
      int[] iarray = {8, 7, 1, 2, 12};
      isorter.BubbleSort(iarray);
      foreach (int item in iarray)
      {
        Console.Write(item+ ", ");
      }
      Console.ReadKey();
    }
  }
 
  public class SortHelper<T> where T : IComparable
  {
    public void BubbleSort(T[] array) 
    {
      int length = array.Length;
      for (int i = 0; i <= length -2; i++)
      {
        for (int j = length - 1; j >= 1; j--)
        {
          if (array[j].CompareTo(array[j-1]) < 0)
          {
            T temp = array[j];
            array[j] = array[j - 1];
            array[j - 1] = temp;
          }
        }
      }
    }
  }
 
</div>

运行结果如下图所示:

2.关于泛型约束

where T : IComparable 把T约束为实现IComparable接口
where T : class
where T : struct
where T : IComparable, new() 约束泛型必须有构造函数

3.关于冒泡算法

● 之所以for (int i = 0; i <= length -2; i++),这是边界思维,比如有一个长度为5的数组,如果0号位元素最终调换到4号位,每次调一个位,需要经过4次才能到4号位,即for(int i = 0; i <= 5-2, i++),i依次为0, 1, 2, 4,期间经历了4次。

● 至于for (int j = length - 1; j >= 1; j--)循环,即遍历从最后一个元素开始到索引为1的元素,每次与前一个位置上的元素比较。

4.关于比较

int类型之所以能比较,是因为int类型也实现了IComparable接口。

byte类型也一样实现了IComparable接口。

二、自定义一个类,使之也能实现冒泡算法

冒泡算法涉及到元素比较,所以自定义类必须实现IComparable接口。

  class Program
  {
    static void Main(string[] args)
    {
      Book[] bookArray = new Book[2];
      Book book1 = new Book(100, "书一");
      Book book2 = new Book(80, "书二");
      bookArray[0] = book1;
      bookArray[1] = book2;
 
      Console.WriteLine("冒泡之前:");
      foreach (Book b in bookArray)
      {
        Console.WriteLine("书名:{0},价格:{1}", b.Title, b.Price);
      }
 
      SortHelper<Book> sorter = new SortHelper<Book>();
      sorter.BubbleSort(bookArray);
      Console.WriteLine("冒泡之后:");
      foreach (Book b in bookArray)
      {
        Console.WriteLine("书名:{0},价格:{1}", b.Title, b.Price);
      }
      Console.ReadKey();
    }
  }
 
  public class SortHelper<T> where T : IComparable
  {
    public void BubbleSort(T[] array) 
    {
      int length = array.Length;
      for (int i = 0; i <= length -2; i++)
      {
        for (int j = length - 1; j >= 1; j--)
        {
          if (array[j].CompareTo(array[j-1]) < 0)
          {
            T temp = array[j];
            array[j] = array[j - 1];
            array[j - 1] = temp;
          }
        }
      }
    }
  }
 
  //自定义类实现IComparable接口
  public class Book : IComparable
  {
    private int price;
    private string title;
 
    public Book(){}
 
    public Book(int price, string title)
    {
      this.price = price;
      this.title = title;
    }
 
    public int Price
    {
      get { return this.price; }
    }
 
    public string Title
    {
      get { return this.title; }
    }
 
    public int CompareTo(object obj)
    {
      Book book = (Book)obj;
      return this.Price.CompareTo(book.Price);
    }
  }

</div>

运行结果如下图所示:

三、针对方法的泛型

继续上面的例子,自定义一个类,并定义泛型方法。

  //方法泛型
  public class MethodSortHelper
  {
    public void BubbleSort<T>(T[] array) where T : IComparable
    {
      int length = array.Length;
      for (int i = 0; i <= length - 2; i++)
      {
        for (int j = length - 1; j >= 1; j--)
        {
          if (array[j].CompareTo(array[j - 1]) < 0)
          {
            T temp = array[j];
            array[j] = array[j - 1];
            array[j - 1] = temp;
          }
        }
      }
    }
  }
 
</div>

主程序如下:

  class Program
  {
    static void Main(string[] args)
    {
      Book[] bookArray = new Book[2];
      Book book1 = new Book(100, "书一");
      Book book2 = new Book(80, "书二");
      bookArray[0] = book1;
      bookArray[1] = book2;
 
      Console.WriteLine("冒泡之前:");
      foreach (Book b in bookArray)
      {
        Console.WriteLine("书名:{0},价格:{1}", b.Title, b.Price);
      }
 
      MethodSortHelper sorter = new MethodSortHelper();
      sorter.BubbleSort<Book>(bookArray);
      Console.WriteLine("冒泡之后:");
      foreach (Book b in bookArray)
      {
        Console.WriteLine("书名:{0},价格:{1}", b.Title, b.Price);
      }
      Console.ReadKey();
    }
  }  
 
</div>

运行结果如下图所示:

另外,使用泛型方法的时候,除了按以下:

MethodSortHelper sorter = new MethodSortHelper(); 
sorter.BubbleSort<Book>(bookArray);
</div>

还可以这样写:  

      MethodSortHelper sorter = new MethodSortHelper(); 
      sorter.BubbleSort(bookArray); 
     </div>

可见,泛型方法可以根据数组实例隐式推断泛型是否满足条件。

四、泛型的其它优点

1.避免隐式装箱和拆箱

以下包含隐式装箱和拆箱:

ArrayList list = new ArrayList();
for(int i = 0; i < 3; i++)
{
  list.Add(i); //Add接收的参数类型是引用类型object,这里包含了隐式装箱
}
for(int i = 0; i < 3; i++)
{
  int value = (int)list[i]; //引用类型强转成值类型,拆箱
  Console.WriteLine(value);
}

</div>

使用泛型避免隐式装箱和拆箱:

List<int> list = new List<int>();
for(int i = 0; i < 3; i++)
{
  list.Add(i);
}
for(int i = 0; i < 3; i++)
{
  int value = list[i];
  Console.WriteLine(value);
}

</div>

2.能在编译期间及时发现错误

不使用泛型,在编译期不会报错的一个例子:

ArrayList list = new ArrayList();
int i = 100;
list.Add(i);
string value = (string)list[0];

</div>

使用泛型,在编译期及时发现错误:

List<int> list = new List<int>();
int i = 100;
list.Add(i);
string value = (string)list[0];

</div>

五、使用泛型的技巧

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C#的泛型方法解析
  • C#给Excel添加水印实例详解
  • C#枚举类型和结构体详解
  • C#基础之泛型
  • C#调用Java方法实例详解
  • C#获取机器码的方法详解(机器名,CPU编号,硬盘编号,网卡mac等)
  • C#中数组Array,ArrayList,泛型List详细对比
  • C#泛型委托的用法实例分析
  • C#同步网络时间的方法实例详解
  • C#中的预处理器指令详解

相关文章

  • 2017-05-28那些年,我还在学习C# 学习笔记续
  • 2017-05-28C#中查找Dictionary中的重复值的方法
  • 2017-05-28c#冒泡排序算法示例
  • 2017-05-28解决C#中WebBrowser的DocumentCompleted事件不执行的实现方法
  • 2017-05-28C#中自定义事件和委托实例
  • 2017-05-28C#预处理器指令的用法实例分析
  • 2017-05-28C#采用OpenXml给Word文档添加表格
  • 2017-05-28用C#编写ActiveX控件(一)
  • 2017-05-28C#飞行棋小程序设计分析
  • 2017-05-28C#中图片.BYTE[]和base64string的转换方法

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 浅谈C#中HttpWebRequest与HttpWebResponse的使用方法
    • C#通过热键控制显示器开关的方法
    • C#加密app.config中连接字符串的方法
    • 对指定的网页进行截图的效果 C#版
    • C#中的数组作为参数传递所引发的问题
    • C# 读写XML(代码分享)
    • C# WinForm捕获未处理的异常实例解析
    • C#画笔Pen绘制曲线的方法
    • C++调用C#的DLL程序实现方法
    • C# Partial:分部方法和分部类代码实例

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有