1. array是一个固定长度的,如果要动态的存储的话就不行了,虽然 System.Collections.ArrayList(),是一个动态的存储的容器,但是没有对存储中的数据进行一个约束,所以非泛型的容器和泛型 的容器相比存在两个问题:
                          1.性能问题;
                          2.安全问题;
=========================================================================================================
2.1.非泛型的命名空间:System.Collections    与   System.Collections.Specialized;

2.2.泛型命名空间:System.Collections.Generic;

=========================================================================================================
3.1.System.Collections.Generic.List<T>:表示可通过索引访问的对象的强类型列表。 提供用于对列表进行搜索、排序和操作的方法。
建立一个CZuigao类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
    class CZuigao
    {
        //2个私有字段用来存储最高分学生的姓名和分数:
        private string name;
        private float score;
        //姓名和分数的属性:
        public string Name
        {
            get { return name; }
            set { if( value.Length > 1 ) { name = value; } }
        }
        public float Score
        {
            get { return score; }
            set { if( float.Parse(value.ToString()) > 0.1f ) { score = (float)value; } }
        }
        //显示存储在私有字段中的信息(姓名 分数);
        public void printf()
        {
            Console.WriteLine("最高分为:{1:f},最高分学生姓名是:{0}",name ,score );
        }
        //构造函数:
        public CZuigao() { }
        public CZuigao(string n, float f)
        {
            Name = n;
            Score = f;
        }
        public CZuigao(string nn)
            : this(nn, 0.11f) { }
        public CZuigao(float ff)
            : this("没有啊!", ff) { }
    }
}

main():

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            //调用3个内部构造函数:
            CZuigao cz = new CZuigao("李异峰");
            cz.printf();
            CZuigao cz1 = new CZuigao(2.3f);
            cz1.printf();
            CZuigao cz2 = new CZuigao("李晓峰", 3.6f);
            cz2.printf();
            //直接初始化赋值属性:
            CZuigao cz3 = new CZuigao() { Name = "我是属性!",Score=8.8f };
            cz3.printf();
            Console.WriteLine("下面是list<t>:");
            //list<T>:
            Program pro = new Program();
            List<CZuigao> lzg = new List<CZuigao>() {new CZuigao("list1",1.1f),new CZuigao("list2",2.1f),new CZuigao("list3",3.3f) };
            foreach( CZuigao scz in lzg ) {
                scz.printf();
            }
            Console.WriteLine("\n添加CZuigao对象后:");
            lzg.Add(cz );
            foreach( CZuigao scz in lzg ) {
                scz.printf();
            };

            Console.ReadLine();

        }
    }

}

F5:

3.2.System.Collections.Generic.Stack<T>类是:表示相同任意类型的实例的可变大小的后进先出 (LIFO) 集合。
依然利用CZuigao类进行输入输出:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            //调用3个内部构造函数:
            CZuigao cz = new CZuigao("李异峰");
            cz.printf();
            CZuigao cz1 = new CZuigao(2.3f);
            cz1.printf();
            CZuigao cz2 = new CZuigao("李晓峰", 3.6f);
            cz2.printf();
            //直接初始化赋值属性:
            CZuigao cz3 = new CZuigao() { Name = "我是属性!",Score=8.8f };
            cz3.printf();
            Console.WriteLine("\n下面是stack<t>:");
            //stack<T>:
            Stack<CZuigao> szg = new Stack<CZuigao>();
            szg.Push(new CZuigao("stack1", 9.8f));
            szg.Push(new CZuigao("stack2",9.2f));
            Console.WriteLine("最后输入的姓名:{0},分数是:{1}",szg.Peek().Name,szg.Peek().Score.ToString() );
            //添加CZuigao类的对象后:
            Console.WriteLine("\n下面是stack<t>添加CZuigao对象后的顶点:");
            szg.Push(cz );
            Console.WriteLine("顶点:姓名:{0},分数是:{1}", szg.Peek().Name, szg.Peek().Score.ToString());
            //移除2条后:
            szg.Pop();
            szg.Pop();
            Console.WriteLine("\n下面是stack<t>移除CZuigao的2条后的顶点:");
            Console.WriteLine("顶点:姓名:{0},分数是:{1}", szg.Peek().Name, szg.Peek().Score.ToString());
            //在移除后:
            try {
                szg.Pop();
                Console.WriteLine("顶点:姓名:{0},分数是:{1}", szg.Peek().Name, szg.Peek().Score.ToString());
            }
            catch(Exception e)
            {
                Console.WriteLine("\n\nszg里面为null,详情如下:{0}",e.ToString());
            }
            Console.ReadLine();

        }
    }

}

F5:

=========================================================================================================
3.3.System.Collections.Generic.Queue<T>类与上面的stack类方法相反为:表示对象的先进先出集合。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            //调用3个内部构造函数:
            CZuigao cz = new CZuigao("李异峰");
            cz.printf();
            CZuigao cz1 = new CZuigao(2.3f);
            cz1.printf();
            CZuigao cz2 = new CZuigao("李晓峰", 3.6f);
            cz2.printf();
            //直接初始化赋值属性:
            CZuigao cz3 = new CZuigao() { Name = "我是属性!",Score=8.8f };
            cz3.printf();
            Console.WriteLine("\n下面是Queue<T>:");
            //Queue<T>:
            //初始化:
            Queue<CZuigao> qzg = new Queue<CZuigao>();
            qzg.Enqueue(new CZuigao("queue1", 5.1f));
            qzg.Enqueue(new CZuigao("queue2",5.2f));
            //返回顶点:
            Console.WriteLine("顶点上的姓名是:{0},分数是:{1:f}",qzg.Peek().Name ,qzg.Peek().Score);
            //添加上面CZuigao类的对象:
            qzg.Enqueue(cz );
            //返回顶点:
            Console.WriteLine("\n添加CZuIgao对象后:\n顶点上的姓名是:{0},分数是:{1:f}", qzg.Peek().Name, qzg.Peek().Score);
            //移除顶点:
            qzg.Dequeue();
            //返回顶点:
            Console.WriteLine("\n移除最高点后:\n顶点上的姓名是:{0},分数是:{1:f}", qzg.Peek().Name, qzg.Peek().Score);
            Console.ReadLine();

        }
    }

}

F5:

=========================================================================================================
3.4.System.Collections.Generic.SortedSet<T>,表示按排序顺序保持的对象的集合。
首先要实现IComparer接口的Compare()方法:

public class IComparse:IComparer <CZuigao >
    {
        #region IComparer<CZuigao> 成员
        int IComparer<CZuigao>.Compare(CZuigao x, CZuigao y)
        {
            if( x.Score > y.Score ) { return 1; }
            if( y.Score > x.Score ) { return -1; }
            else { return 0; }
        }
        #endregion
    }

再main():

  static void Main(string[] args)
        {
            //初始化sortedset<T>:
            //***************注意啊 :在Generic.SortedSet类中要初始化构造函数****************************
            System.Collections.Generic.SortedSet<CZuigao> sorzg = new SortedSet<CZuigao>(new IComparse());
            //初始化5个CZuigao的对象:
            Queue<CZuigao> qzg = new Queue<CZuigao>();
            for( int i = 0; i < 5; i++ ) {
                qzg.Enqueue(new CZuigao(string.Format("sortedset{0:d}", i), float.Parse(i.ToString())));
            }
            //将Queue<CZuigao> qzg中的数据复制到sorzg里面保存:
            foreach( CZuigao qq in qzg ) {
                sorzg.Add(qq);
            }
            //遍历sortedset对象中的数据:
            Console.WriteLine("初始化后的遍历:");
            foreach( CZuigao sor in sorzg ) { Console.WriteLine("name={0},\tscore={1:f}", sor.Name, sor.Score); }
            //添加一条数据对象:
            sorzg.Add(new CZuigao("sortedset5",3.1f));
            //遍历sortedset对象中的数据:
            //下面是添加后的遍历:
            Console.WriteLine("\n下面是添加后的遍历:");
            foreach( CZuigao sor in sorzg ) { Console.WriteLine("name={0},\tscore={1:f}", sor.Name, sor.Score); }
            Console.ReadLine();
        }

F5后的数据比较:

这样排序保存主要的是IComparer接口的Compare()方法实现的;
现在还可以对其进行修改后看顶点:

            //移除最高点操作:
            sorzg.Remove((CZuigao)sorzg.Max );
            Console.WriteLine("\n当前sortedset内共有:{0:d}个对象数据;\n下面是移除最高点后的遍历:",sorzg.Count);
            foreach( CZuigao sor in sorzg ) { Console.WriteLine("name={0},\tscore={1:f}", sor.Name, sor.Score); }

F5:

========================================================================================================
3.5.
在System.Collections.ObjectModel空间下有个
System.Collections.ObjectModel.ObservableCollection<T>类,表示一个动态数据集
合,在添加项、移除项或刷新整个列表时,此集合将提供通知。

其用法和list<t>类似:

 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 //using System.Collections;
 //using System.Collections.Specialized;
 using System.Collections.ObjectModel;
 namespace ConsoleApplication1
 {
     class Program
     {
         static void Main(string[] args)
         {
            ObservableCollection<CZuigao> obzg = new ObservableCollection<CZuigao>() {new CZuigao ("observablecollection1",3.1f) };

             obzg.CollectionChanged+=obzg_CollectionChanged;
             //添加对象:
             obzg.Add(new CZuigao("observablecollection2", 8.1f));
             //遍历当前所有的对象数据:
             Console.WriteLine("\n当前所有的对象数据:");
             foreach( CZuigao ss in obzg )
             {
                 Console.WriteLine("name={0},\tscore={1:f}",ss.Name ,ss.Score );
             }
             Console.WriteLine("\n");
             //移除:
             obzg.RemoveAt();
             Console.ReadLine();
         }
         //public enum NotifyCollectionChangedAction
         //{
         //  Add = 0,
         //  Remove = 2,
         //}
 private static void obzg_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
 {
                 if( e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add  )
             {
                 Console.WriteLine("用户刚刚操作是添加操作,共添加了{0:d}个对象数据,详情如下:",e.NewItems.Count );
                 foreach( CZuigao ss in e.NewItems )
                 {
                     Console.WriteLine("name={0},\tscore={1:f}",ss.Name,ss.Score  );
                 }
             }
             if( e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Remove )
             {
                 Console.WriteLine("是移除操作,共移除{0:d}个对象数据,详情如下:",e.OldItems .Count );
                 foreach( CZuigao ss in e.OldItems  )
                 {
                     Console.WriteLine("name={0},\tscore={1:f}", ss.Name, ss.Score);
                 }
             }
 }

     }

 }

F5:

=========================================================================================================
3.6.实际中还可以自定义generic方法:
写一个调换方法:
                            对值类型进行调换:

         public static void Cdiaohuan<T>(ref T zg1,ref T zg2)
         {
             //下面这几行代码就是用来实现对象之间调换问题:
             //首先就需要定义一个临时的对象存储变量:
             T Temp;
             Temp = zg1;
             zg1 = zg2;
             zg2 = Temp;
         }

main():

         static void Main(string[] args)
         {
         //用值类型来进行调换:
             , b = ;
             Cdiaohuan<Int32>(ref a ,ref b );
             //输出a,b:
             Console.WriteLine("a is {0:d}\tb is {1:d}",a ,b );
             Console.ReadLine();
         }

F5就不截屏了;
                         对引用类型:CZuigao的对象进行调换:

         static void Main(string[] args)
         {
             // 对引用类型:CZuigao的对象进行调换:
             CZuigao zg1 = new CZuigao() {Name="object1",Score=1.1f };
             CZuigao zg2 = new CZuigao() {Name="object2",Score=2.2f };
             //输出对象中的数据:
             Console.WriteLine("zg1对象中的:name={0}\tscore={1:f}",zg1.Name ,zg1.Score );
             Console.WriteLine("zg2对象中的:name={0}\tscore={1:f}",zg2.Name ,zg2.Score );
             //调用方法:
             Cdiaohuan<CZuigao>(ref zg1, ref zg2);
             Console.WriteLine("\n下面就是执行方法后的对象中的数据值:");
             //输出对象中的数据:
             Console.WriteLine("zg1对象中的:name={0}\tscore={1:f}", zg1.Name, zg1.Score);
             Console.WriteLine("zg2对象中的:name={0}\tscore={1:f}", zg2.Name, zg2.Score);
             Console.ReadLine();
         }

F5:

当然了输出这两句话可以再写个方法进行输出,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

****还可以将generic应用到class和interface/struct/委托里,就是不能用在enum中:

写一个generic的class:

 namespace ConsoleApplication1
 {
     class CValue<T>
     {
         public T values1, values2;
         public void printf()
         {
             Console.WriteLine("values1 is {0}\nvalues2 is {1}",values1.ToString(),values2.ToString());
         }
     }
 }

在main()中实现:

         static void Main(string[] args)
         {
             CValue<Int32> cv = new CValue<int>();
             cv.values1 = ;
             cv.values2 = ;
             cv.printf();

             Console.ReadLine();
         }

=========================================================================================================
3.7.上面的这实例还是存在一定的漏洞,比如说上面3.6.中说的一个方法:public static void Cdiaohuan<T>(ref T zg1,ref T zg2),可以对值类型和引用类型就行调换,如果我们强制要求只能调换object类型呢?这样的话就要用到generic中的约束,where和sqlser中的where的意思有点类似筛选符合的要求:
看看3.6.中的   public static void Cdiaohuan<T>(ref T zg1,ref T zg2):

         public static void Cdiaohuan<T>(ref T zg1,ref T zg2)
         {
             //下面这几行代码就是用来实现对象之间调换问题:
             //首先就需要定义一个临时的对象存储变量:
             T Temp;
             Temp = zg1;
             zg1 = zg2;
             zg2 = Temp;
         }

添加个object约束:

         public static void Cdiaohuan<T>(ref T zg1,ref T zg2) where T :Class
         {
             //下面这几行代码就是用来实现对象之间调换问题:
             //首先就需要定义一个临时的对象存储变量:
             T Temp;
             Temp = zg1;
             zg1 = zg2;
             zg2 = Temp;
         }

如果还是让方法执行value的调换的话:

         static void Main(string[] args)
         {
             , b = ;
             try { Cdiaohuan<Int32>(ref a, ref b); }
             catch( Exception ex ) { Console.WriteLine(ex.ToString()); }

             Console.ReadLine();
         }

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
执行object类型的调换:
在此之前在 class CZuigao 完成接口的实现;     class CZuigao:IComparable <CZuigao > :

         #region IComparable<CZuigao> 成员
         int IComparable<CZuigao>.CompareTo(CZuigao other)
         {
             ; }
             ; }
             ; }
         }
         #endregion
         static void Main(string[] args)
         {
             //初始化List<T>,并添加2条对象数据:
             List<CZuigao> lzg = new List<CZuigao>() { new CZuigao("yueshu1", 1.1f), new CZuigao("yueshu2", 2.2f) };
             Console.WriteLine("List<T>中的对象数据条:");
             //遍历输出:
             foreach( CZuigao ss in lzg ) { Console.WriteLine("name={0}\tscore={1:f}", ss.Name, ss.Score); }
             CZuigao zg1 = (CZuigao)lzg.Min();
             CZuigao zg2 = (CZuigao)lzg.Max();
             //print当前CZuigao的zg1和zg2对象中的数据:
             Console.WriteLine("\nzg1:\nname={0}\tscore={1:f}",zg1.Name ,zg1.Score );
             Console.WriteLine("zg2:\nname={0}\tscore={1:f}\n", zg2.Name, zg2.Score);
             Cdiaohuan<CZuigao>(ref zg1 ,ref zg2 );
             //print执行Cdiaohuan()方法后的CZuigao的zg1和zg2对象中的数据:
             Console.WriteLine("\nzg1:\nname={0}\tscore={1:f}", zg1.Name, zg1.Score);
             Console.WriteLine("zg2:\nname={0}\tscore={1:f}\n", zg2.Name, zg2.Score);
                 Console.ReadLine();
         }

F5:

ok!
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
最后总结下where中有哪些约束类型:
1.where t:class       类型参数为object
2.where t:struct      类型参数为vale     type
3.where t:new()      必须包含一个构造函数
4.where t:baseClass      必须是它的派生类
5.where t:interface    必须实现该接口;

不能将类型参数运用在c#算术运算符(/*-+)上。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

完!

C#:system.collections.generic(泛型)的更多相关文章

  1. Web Service接口返回泛型的问题(System.InvalidCastException: 无法将类型为“System.Collections.Generic.List`1[System.String]”的对象强制转换为类型“System.String[]”)

    在使用C#写Web Service时遇到了个很奇怪的问题.返回值的类型是泛型(我用的是类似List<string>)的接口,测试时发现总是报什么无法转换为对象的错误,百思不得其解. 后来在 ...

  2. System.Collections.Generic的各容器类的用法

    演示System.Collections.Generic的各容器类的用法. 包括:Dictionary,KeyValuePair,SortedDic tionary,SortedList,HashSe ...

  3. NHibernate无法将类型“System.Collections.Generic.IList<T>”隐式转换为“System.Collections.Generic.IList<IT>

    API有一个需要实现的抽象方法: public IList<IPermission> GetPermissions(); 需要注意的是IList<IPermission>这个泛 ...

  4. using System.Collections.Generic;

    public class CommonClass { public static void ShowInt(int iValue) { //typeof(CommonClass) typeof关键字 ...

  5. C# System.Collections.Generic.Dictionary

    using System; using System.Collections.Generic; public class Example { public static void Main() { / ...

  6. System.Collections.Generic.List<T> 与 System.Collections.ArrayList

    [推荐] System.Collections.Generic.List<T> [原因] 泛型集合类List<T>在操作值类型的集合时可以不进行 装箱/拆箱 处理. 使得性能较 ...

  7. 无法将类型为“System.Windows.Controls.SelectedItemCollection”的对象强制转换为类型“System.Collections.Generic.IList`1

    在WPF中DataGrid 选择事件中获取SelectedItems 报错如下 无法将类型为“System.Windows.Controls.SelectedItemCollection”的对象强制转 ...

  8. Unity3d:Unknown type 'System.Collections.Generic.CollectionDebuggerView'1

    问题描述:如图,在调试状态下说:Unknown type 'System.Collections.Generic.CollectionDebuggerView'1<ignore_js_op> ...

  9. webservice asmx 无法序列化接口 System.Collections.Generic.IList

    转载自:http://www.cnblogs.com/chenhuzi/p/4178194.html 今天有位同事在方法里加了一个IList<entity> 的返回值,也没有测试,直接发布 ...

随机推荐

  1. CAN总线的显性电平为什么能覆盖隐性电平?

    摘要:在CAN总线中,显性电平是强驱动,隐性电平时弱驱动,因此当有的节点发送显性电平有的节点发送隐性电平时,总线上呈现的肯定是强驱动的状态,这就是CAN总线显性电平可以覆盖隐性电平的原因. 大家都知道 ...

  2. jenkins 多任务串行执行

    摘要 今天在新创建自动化部署项目的时候遇到了一个问题:我们的项目是maven聚合的所以在构建maven项目的时候要从parent开始build,但是这样会造成一个问题,我每次添加此parent项目下的 ...

  3. 《Python 网络爬虫权威指南》 分享 pdf下载

    链接:https://pan.baidu.com/s/1ZYEinjOwM_5dBIVftN42tg 提取码:1om6

  4. svn树冲突的解决方法

    树冲突 就是开发人员移动.重命名.删除一个文件或文件夹,而另一名开发人员也对它们进行了移动.重命名.删除或者仅仅是修改时就会发生树冲突.有很多种不同的情形可以导致树冲突,而且不同的情形需要不同的步骤来 ...

  5. Siki_Unity_3-7_AssetBundle从入门到掌握

    Unity 3-7 AssetBundle从入门到掌握 任务1&2&3:课程介绍 AssetBundle -- 用于资源的更新 为了之后的xLua (Lua热更新的框架)打下基础 任务 ...

  6. 【CodeForces-1041C】Coffee Break(二分解决关于set,pair,upper_bound用法)

    //题意:一个的工作时间是m分钟. // 在特定的时间和咖啡 n a1,a2....an,, ai代表的是每个咖啡要在一天中对应的时间点喝掉 // 每一次喝咖啡的时间为1分钟 // 必须在一天中的ai ...

  7. yocto-sumo源码解析(一): oe-init-build-env

    oe-init-build-env是yocto构建环境运行的第一个脚本,通过运行下面的命令: . oe-init-build-env build-arm64 即可对yocto项目进行构建,顾名思义,该 ...

  8. kali linux执行apt-get update失败(数字签名过期)

    想要安装某个软件,执行apt-get update 失败,出现下面的错误: 自己查看了更新源是没有问题的,根据提示的错误google了一下,发现是数字签名过期了. 执行下面命令: apt-key ad ...

  9. Centos7 zabbix 自动发现与注册

    自动发现与自动注册 自动发现: zabbix Server主动发现所有客户端,然后将客户端登记自己的小本上,缺点zabbix server压力山大(网段大,客户端多),时间消耗多. 自动注册: zab ...

  10. 深入理解JavaScript函数参数

    前面的话 javascript函数的参数与大多数其他语言的函数的参数有所不同.函数不介意传递进来多少个参数,也不在乎传进来的参数是什么数据类型,甚至可以不传参数. arguments javascri ...