C# 2.0学习之--泛型

原创 2006年06月23日 18:43:00

// Copyright (C) Microsoft Corporation.  All rights reserved.

using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;

namespace Generics_CSharp
{
    //Type parameter T in angle brackets.
    public class MyList<T> : IEnumerable<T>
    {
        protected Node head;
        protected Node current = null;

        // Nested type is also generic on T
        protected class Node
        {
            public Node next;
            //T as private member datatype.
            private T data;
            //T used in non-generic constructor.
            public Node(T t)
            {
                next = null;
                data = t;
            }
            public Node Next
            {
                get { return next; }
                set { next = value; }
            }
            //T as return type of property.
            public T Data
            {
                get { return data; }
                set { data = value; }
            }
        }

        public MyList()
        {
            head = null;
        }

        //T as method parameter type.
        public void AddHead(T t)
        {
            Node n = new Node(t);
            n.Next = head;
            head = n;
        }

        // Implement GetEnumerator to return IEnumerator<T> to enable
        // foreach iteration of our list. Note that in C# 2.0
        // you are not required to implement Current and MoveNext.
        // The compiler will create a class that implements IEnumerator<T>.
        public IEnumerator<T> GetEnumerator()
        {
            Node current = head;

            while (current != null)
            {
                yield return current.Data;
                current = current.Next;
            }
        }

        // We must implement this method because
        // IEnumerable<T> inherits IEnumerable
        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }
    }


    public class SortedList<T> : MyList<T> where T : IComparable<T>
    {
        // A simple, unoptimized sort algorithm that
        // orders list elements from lowest to highest:
        public void BubbleSort()
        {
            if (null == head || null == head.Next)
                return;

            bool swapped;
            do
            {
                Node previous = null;
                Node current = head;
                swapped = false;

                while (current.next != null)
                {
                    //  Because we need to call this method, the SortedList
                    //  class is constrained on IEnumerable<T>
                    if (current.Data.CompareTo(current.next.Data) > 0)
                    {
                        Node tmp = current.next;
                        current.next = current.next.next;
                        tmp.next = current;

                        if (previous == null)
                        {
                            head = tmp;
                        }
                        else
                        {
                            previous.next = tmp;
                        }
                        previous = tmp;
                        swapped = true;
                    }

                    else
                    {
                        previous = current;
                        current = current.next;
                    }

                }// end while
            } while (swapped);
        }
    }

    // A simple class that implements IComparable<T>
    // using itself as the type argument. This is a
    // common design pattern in objects that are
    // stored in generic lists.
    public class Person : IComparable<Person>
    {
        string name;
        int age;

        public Person(string s, int i)
        {
            name = s;
            age = i;
        }

        // This will cause list elements
        // to be sorted on age values.
        public int CompareTo(Person p)
        {
            return age - p.age;
        }

        public override string ToString()
        {
            return name + ":" + age;
        }

        // Must implement Equals.
        public bool Equals(Person p)
        {
            return (this.age == p.age);
        }
    }

    class Generics
    {
        static void Main(string[] args)
        {
            //Declare and instantiate a new generic SortedList class.
            //Person is the type argument.
            SortedList<Person> list = new SortedList<Person>();

            //Create name and age values to initialize Person objects.
            string[] names = new string[] { "Franscoise", "Bill", "Li", "Sandra", "Gunnar", "Alok", "Hiroyuki", "Maria", "Alessandro", "Raul" };
            int[] ages = new int[] { 45, 19, 28, 23, 18, 9, 108, 72, 30, 35 };

            //Populate the list.
            for (int x = 0; x < names.Length; x++)
            {
                list.AddHead(new Person(names[x], ages[x]));
            }

            Console.WriteLine("Unsorted List:");
            //Print out unsorted list.
            foreach (Person p in list)
            {
                Console.WriteLine(p.ToString());
            }

            //Sort the list.
            list.BubbleSort();

            Console.WriteLine(String.Format("{0}Sorted List:", Environment.NewLine));
            //Print out sorted list.
            foreach (Person p in list)
            {
                Console.WriteLine(p.ToString());
            }

            Console.WriteLine("Done");
        }
    }

}


 

csc generics.cs
generics

C# 泛型编程之泛型类、泛型方法、泛型约束

原文出处:http://www.cnblogs.com/arxive/p/6179972.html 所谓泛型,即通过参数化类型来实现在同一份代码上操作多种数据类型。   泛型编程是一种编程...
  • chelen_jak
  • chelen_jak
  • 2017年01月16日 18:08
  • 655

C# 泛型理解之大白话

泛型:泛就是多,许多,很多的意思;型:就是类型,比如:int、float、double等等的数据类型;连接起来就是许多不同的数据类型,包括内置数据类型:就是系统自带,定义好的;自定义类型:就是自己定义...
  • Rose_Girls
  • Rose_Girls
  • 2015年10月09日 23:35
  • 1237

c#泛型使用详解:泛型特点、泛型继承、泛型接口、泛型委托

泛型:通过参数化类型来实现在同一份代码上操作多种数据类型。利用“参数化类型”将类型抽象化,从而实现灵活的复用。在.NET类库中处处都可以看到泛型的身影,尤其是数组和集合中,泛型的存在也大大提高了程序员...
  • zdhlwt2008
  • zdhlwt2008
  • 2016年04月29日 09:28
  • 4090

C#三十二 泛型的理解和使用

日常生活中的事物都是有类型的,比如我们说“一个女人”,那么“女”就是这个人的类型。我们可以说“女人都是水做的”,那么听者都知道这是在说“女”这种类型的人。再比如你去肉店买肉,你可以对老板说“我要十斤猪...
  • zhangchen124
  • zhangchen124
  • 2016年05月11日 21:52
  • 5051

C#学习日记30---泛型类、泛型方法、泛型委托

泛型允许您延迟编写类或方法中的编程元素的数据类型的规范,直到实际在程序中使用它的时候。换句话说,在声明类或方法的时候由于不知道用户要传入什么样类型的参数,所以在传入类型的地方“挖一个坑(“<T>”)"...
  • HC666
  • HC666
  • 2015年10月23日 21:57
  • 3242

浅谈Java和C#泛型及C++模板

最近偶然接触到了类型擦除(TypeErasure)这个概念。通过查了一些资料才知道Java和C#的泛型是有一些区别的,当然与C++的模板也不一样。因此做了如下整理。 泛型的本质就是让你的类型能够拥有...
  • jackliu91
  • jackliu91
  • 2014年11月24日 18:29
  • 1122

如何通过C#.NET中的反射机制来创建C#.NET泛型类的实例,并调用其方法??

如何通过C#.NET中的反射机制来创建C#.NET泛型类的实例,并调用其方法?
  • phker
  • phker
  • 2016年06月21日 08:37
  • 1110

C#和java中泛型的本质区别

转自: 为什么JVM上没有C#语言?浅谈Type Erasure特性 每次提到语言的时候我总是忍不住骂Java是一门生产力低下,固步自封的语言——这估计要一直等到Java语言被JVM上...
  • u012780317
  • u012780317
  • 2016年06月17日 11:46
  • 936

C#泛型好处知多少

1.性能 性能是泛型的一个主要优点。 直接上例子,通过实例可以让我们很好的理解这一点。 Stopwatch stopwatch = new Stopwatch(); stopwatch.Start()...
  • tiana0
  • tiana0
  • 2013年09月01日 12:00
  • 2945

C# 之泛型详解

--转载于C# 之泛型详解 什么是泛型        我们在编写程序时,经常遇到两个模块的功能非常相似,只是一个是处理int数据,另一个是处理string数据,或者其他自定义的数据类型,但我们没有办...
  • taoerchun
  • taoerchun
  • 2016年05月11日 18:23
  • 1096
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C# 2.0学习之--泛型
举报原因:
原因补充:

(最多只允许输入30个字)