zoukankan      html  css  js  c++  java
  • 泛型List

     

    数组类型的一个典型问题是固定容量。如果您预先不知道数组将容纳多少对象,就会冒着给数组声明太小(溢出)或太大(浪费空间)的空间的风险。

    您的程序可能让用户输入数据或从Web站点收集数据。当它发现对象(字符串,书,值等等),将把它们添加进数组,但您并不知道在这段时间内会收集多少数据。固定尺寸的数组并不是一个很好的选择,因为您并不知道需要多大的数组。

    List类是一个根据需要动态增加尺寸的数组。它提供了一组有用的方法和属性用于操作。它们中最重要的显示在表9-3中。

    9-3 List的方法和属性

    方法或属性

    作用

    Capacity

    用于获取或设置List可容纳元素的数量。当数量超过容量时这个值会自动增长。您可以设置这个值以减少容量,也可以调用trin()方法来减少容量以适合实际的元素数目。

    Count

    属性,用于获取数组中当前元素数量

    Item( )

    通过指定索引获取或设置元素。对于List类来说,它是一个索引器。

    Add( )

    List中添加一个对象的公有方法

    AddRange( )

    公有方法,在List尾部添加实现了ICollection接口的多个元素

    BinarySearch( )

    重载的公有方法,用于在排序的List内使用二分查找来定位指定元素.

    Clear( )

    List内移除所有元素

    Contains( )

    测试一个元素是否在List

    CopyTo( )

    重载的公有方法,把一个List拷贝到一维数组内

    Exists( )

    测试一个元素是否在List

    Find( )

    查找并返回List内的出现的第一个匹配元素

    FindAll( )

    查找并返回List内的所有匹配元素

    GetEnumerator( )

    重载的公有方法,返回一个用于迭代List的枚举器

    Getrange( )

    拷贝指定范围的元素到新的List

    IndexOf( )

    重载的公有方法,查找并返回每一个匹配元素的索引

    Insert( )

    List内插入一个元素

    InsertRange( )

    List内插入一组元素

    LastIndexOf( )

    重载的公有方法,,查找并返回最后一个匹配元素的索引

    Remove( )

    移除与指定元素匹配的第一个元素

    RemoveAt( )

    移除指定索引的元素

    RemoveRange( )

    移除指定范围的元素

    Reverse( )

    反转List内元素的顺序

    Sort( )

    List内的元素进行排序

    ToArray( )

    List内的元素拷贝到一个新的数组内

    trimToSize( )

    将容量设置为List中元素的实际数目

     

    FCL的习惯是给集合类提供一个Item元素,它在C#中被实现为一个索引器

    当您创建了一个List,并没有定义它可以容纳多少对象。在List内添加元素使用Add()方法,列表会自已处理它内部的帐目,如例9-13所示。

    9-13 List的使用


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

    namespace ListCollection
    {
        
    //存储于List内的一个简单类
        public class Employee
        {
            
    private int empID;
            
    public Employee(int empID)
            {
                
    this.empID = empID;
            }
            
    public override string ToString()
            {
                
    return empID.ToString();
            }
            
    public int EmpID
            {
                
    get
                {
                    
    return empID;
                }
                
    set
                {
                    empID 
    = value;
                }
            }
        }
        
    public class Tester
        {
            
    static void Main()
            {
                List
    <Employee> empList = new List<Employee>();
                List
    <int> intList = new List<int>();
                
    //填充List
                for (int i = 0; i < 5; i++)
                {
                    empList.Add(
    new Employee(i + 100));
                    intList.Add(i 
    * 5);
                }
                
    //打印整数列表所有内容
                for (int i = 0; i < intList.Count; i++)
                {
                    Console.Write(
    "{0} ", intList[i].ToString());
                }
                Console.WriteLine(
    "\n");
                
    //打印员工列表的所有内容
                for (int i = 0; i < empList.Count; i++)
                {
                    Console.Write(
    "{0} ", empList[i].ToString());
                }
                Console.WriteLine(
    "\n");
                Console.WriteLine(
    "empList.Capacity: {0}", empList.Capacity);
            }
        }
    }

     

    输出结果:

    0 5 10 15 20

    100 101 102 103 104

    empArray.Capacity: 16

    (译者注:很有意思,在我的电脑上empArray.Capacity输出的是8,看样子老外的电脑和操作系统跟我们的是有些不同)

    Array中,您定义了Array操作对象的数目,如果尝试添加多于这个数目的元素,Array将引发一个异常。在List中,您不需要声明List操作对象的数目。List有一个Capacity属性,表示List能够存储的元素的数目:

    public int Capacity { get; set; }

    默认容量是16,当您添加第17个元素时,容量会自动翻倍为32。如果您改变for循环为:

    for (int i = 0;i<17;i++)

    输出结果会变成这样:

    0 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80

    5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

    empArray.Capacity: 32

    您可以手动设置容量为任何等于或大于这个数目的数字。如果您把它设置为小于这个数目的数字,程序将引发一个ArgumentOutOfRangeException异常。
  • 相关阅读:
    Eclipse Alt + / 快捷键失效
    oracle nvl()函数
    搭建spring boot项目
    Maximum call stack size exceeded
    vue混入函数问题
    ASP.NET Core 2.0中的Azure Blob存储
    如何在ASP.NET Core 2.0中使用Razor页面
    将参数传递给ASP.NET Core 2.0中的中间件
    使用.net core在Ubuntu构建一个TCP服务器
    如何在ASP.NET Core Web API测试中使用Postman
  • 原文地址:https://www.cnblogs.com/abatei/p/1066496.html
Copyright © 2011-2022 走看看