C#中數組Array、ArrayList、泛型List的比較

在C#中數組Array,ArrayList,泛型List都可以存儲一組對象,可是在開發中根本不知道用哪一個性能最高,下面咱們慢慢分析分析。數組

1、數組Array

數組是一個存儲相同類型元素的固定大小的順序集合。數組是用來存儲數據的集合,一般認爲數組是一個同一類型變量的集合。安全

Array 類是 C# 中全部數組的基類,它是在 System 命名空間中定義。性能

數組在內存中是連續存儲的,因此它的索引速度很是快,並且賦值與修改元素也很是簡單。spa

Array數組具體用法:.net

using System;

namespace WebApp
{
    class Program
    {
        static void Main(string[] args)
        {
            //System.Array
            //一、數組[] 特定類型、固定長度
            string[] str1 = new string[3];
            str1[0] = "a";
            str1[1] = "b";
            str1[2] = "c";
            Console.WriteLine(str1[2]);

            string[] str2 = new string[] { "a", "b", "c" };
            Console.WriteLine(str2[0]);

            string[] str3 = { "a", "b", "c" };
            Console.WriteLine(str3[0]);
            //二、二維數組
            //int[,] intArray=new int[2,3]{{1,11,111},{2,22,222}};
            int[,] intArray = new int[2, 3];
            intArray[0, 0] = 1;
            intArray[0, 1] = 11;
            intArray[0, 2] = 111;

            intArray[1, 0] = 2;
            intArray[1, 1] = 22;
            intArray[1, 2] = 222;
            Console.WriteLine("{0},{1},{2}", intArray[0, 0], intArray[0, 1], intArray[0, 2]);
            Console.WriteLine("{0},{1},{2}", intArray[1, 0], intArray[1, 1], intArray[1, 2]);

            //三、多維數組
            int[, ,] intArray1 = new int[,,]
            {
                {{1, 1}, {11, 11}, {111, 111}},
                {{2, 2}, {22, 22}, {222, 222}},
                {{3, 3}, {33, 33}, {333, 333}}
            };
            Console.WriteLine("{0},{1},{2},{3},{4},{5}", intArray1[0, 0, 0], intArray1[0, 0, 1], intArray1[0, 1, 0], intArray1[0, 1, 1],
               intArray1[0, 2, 0], intArray1[0, 2, 1]);
            Console.WriteLine("{0},{1},{2},{3},{4},{5}", intArray1[1, 0, 0], intArray1[1, 0, 1], intArray1[1, 1, 0], intArray1[1, 1, 1],
                intArray1[1, 2, 0], intArray1[1, 2, 1]);
            Console.WriteLine("{0},{1},{2},{3},{4},{5}", intArray1[2, 0, 0], intArray1[2, 0, 1], intArray1[2, 1, 0], intArray1[2, 1, 1],
                intArray1[2, 2, 0], intArray1[2, 2, 1]);

            //四、交錯數組即數組的數組
            int[][] intArray2 = new int[4][];
            intArray2[0] = new int[] { 1 };
            intArray2[1] = new int[] { 2, 22 };
            intArray2[2] = new int[] { 3, 33, 333 };
            intArray2[3] = new int[] { 4, 44, 444,4444 };
            for (int i = 0; i < intArray2.Length; i++)
            {
                for (int j = 0; j < intArray2[i].Length; j++)
                {
                    Console.WriteLine("{0}", intArray2[i][j]);
                }
            }


            Console.ReadKey();
        }
    }
}

數組雖然存儲檢索數據很快,可是也有一些缺點:code

一、在聲明數組的時候必須指定數組的長度,若是不清楚數組的長度,就會變得很麻煩。對象

二、數組的長度太長,會形成內存浪費;過短會形成數據溢出的錯誤。blog

三、在數組的兩個數據間插入數據是很麻煩的繼承

更多參考微軟官方文檔:Array 類 (System)索引

2、ArrayList

既然數組有不少缺點,C#就提供了ArrayList對象來克服這些缺點。

ArrayList是在命名空間System.Collections下,在使用該類時必須進行引用,同時繼承了IList接口,提供了數據存儲和檢索。

ArrayList對象的大小是按照其中存儲的數據來動態擴充與收縮的。所以在聲明ArrayList對象時並不須要指定它的長度。

ArrayList 的默認初始容量爲 0。隨着元素添加到 ArrayList 中,容量會根據須要經過從新分配自動增長。可經過調用 TrimToSize 或經過顯式設置 Capacity 屬性減小容量。

using System;
using System.Collections;
public class SamplesArrayList  {

   public static void Main()  {
ArrayList myAL = new ArrayList(); myAL.Add("Hello"); myAL.Add("World"); myAL.Add("!"); Console.WriteLine( "myAL" ); Console.WriteLine( " Count: {0}", myAL.Count ); Console.WriteLine( " Capacity: {0}", myAL.Capacity ); Console.Write( " Values:" ); PrintValues( myAL ); } public static void PrintValues( IEnumerable myList ) { foreach ( Object obj in myList ) Console.Write( " {0}", obj ); Console.WriteLine();
      Console.ReadKey(); } }

運行結果:

ArrayList解決了數組中全部的缺點,可是在存儲或檢索值類型時一般發生裝箱和取消裝箱操做,帶來很大的性能耗損。尤爲是裝箱操做,例如:

            ArrayList list = new ArrayList();

            //add 
            list.Add("joye.net");
            list.Add(27);

            //update  
            list[2] = 28;

            //delete 
            list.RemoveAt(0);

            //Insert  
            list.Insert(0, "joye.net1");  

在List中,先插入了字符串joye.net,並且插入了int類型27。這樣在ArrayList中插入不一樣類型的數據是容許的。由於ArrayList會把全部插入其中的數據看成爲object類型來處理,在使用ArrayList處理數據時,極可能會報類型不匹配的錯誤,也就是ArrayList不是類型安全的

更多參考微軟官方ArrayList文檔:ArrayList 類 (System.Collections)

3、泛型List<T>

因爲ArrayList存在不安全類型與裝箱拆箱的缺點,因此出現了泛型的概念。

List 類是 ArrayList 類的泛型等效類。該類使用大小可按需動態增長的數組實現 IList 泛型接口,大部分用法都與ArrayList類似。

List<T> 是類型安全的,在聲明List集合時,必須爲其聲明List集合內數據的對象類型。

using System;
using System.Collections.Generic;

public class Example
{
    public static void Main()
    {
        List<string> dinosaurs = new List<string>();

        Console.WriteLine("\nCapacity: {0}", dinosaurs.Capacity);

        dinosaurs.Add("Tyrannosaurus");
        dinosaurs.Add("Amargasaurus");
        dinosaurs.Add("Mamenchisaurus");
        dinosaurs.Add("Deinonychus");
        dinosaurs.Add("Compsognathus");

        Console.WriteLine();
        foreach(string dinosaur in dinosaurs)
        {
            Console.WriteLine(dinosaur);
        }

        Console.WriteLine("\nCapacity: {0}", dinosaurs.Capacity);
        Console.WriteLine("Count: {0}", dinosaurs.Count);

        Console.WriteLine("\nContains(\"Deinonychus\"): {0}",
            dinosaurs.Contains("Deinonychus"));

        Console.WriteLine("\nInsert(2, \"Compsognathus\")");
        dinosaurs.Insert(2, "Compsognathus");

        Console.WriteLine();
        foreach(string dinosaur in dinosaurs)
        {
            Console.WriteLine(dinosaur);
        }

        Console.WriteLine("\ndinosaurs[3]: {0}", dinosaurs[3]);

        Console.WriteLine("\nRemove(\"Compsognathus\")");
        dinosaurs.Remove("Compsognathus");

        Console.WriteLine();
        foreach(string dinosaur in dinosaurs)
        {
            Console.WriteLine(dinosaur);
        }

        dinosaurs.TrimExcess();
        Console.WriteLine("\nTrimExcess()");
        Console.WriteLine("Capacity: {0}", dinosaurs.Capacity);
        Console.WriteLine("Count: {0}", dinosaurs.Count);

        dinosaurs.Clear();
        Console.WriteLine("\nClear()");
        Console.WriteLine("Capacity: {0}", dinosaurs.Capacity);
        Console.WriteLine("Count: {0}", dinosaurs.Count);
    }
}

若是聲明List集合內數據的對象類型是string,而後往List集合中插入int類型的111,IDE就會報錯,且不能經過編譯。顯然這樣List<T>是類型安全的。

對返回結果集再封裝:

    public class ResultDTO<T>
    {
        public T Data { get; set; }
        public string Code { get; set; }
        public string Message { get; set; }
    }
            var data = new CityEntity();
            return new ResultDTO<CityEntity> { Data = data, Code = "1", Message = "sucess"};

            var data2 = new List<CityEntity>();
            return new ResultDTO<List<CityEntity>> { Data = data2, Code = "1", Message = "sucess" };

            var data1 = 1;
            return new ResultDTO<int> { Data = data1, Code = "1", Message = "sucess" };

更多參考微軟官方文檔:List泛型類

4、總結

一、數組的容量固定,而ArrayList或List<T>的容量可根據須要自動擴充。

二、數組可有多個維度,而 ArrayList或 List< T> 始終只有一個維度。(能夠建立數組列表或列表的列表)

三、特定類型的數組性能優於 ArrayList的性能(不包括Object,由於 ArrayList的元素是 Object ,在存儲或檢索值類型時一般發生裝箱和取消裝箱操做)。

四、 ArrayList 和 List<T>基本等效,若是List< T> 類的類型T是引用類型,則兩個類的行爲是徹底相同的。若是T是值類型,須要考慮裝箱和拆箱形成的性能損耗。List<T> 是類型安全。

相關文章
相關標籤/搜索