程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#中數組Array,ArrayList,泛型List具體比較

C#中數組Array,ArrayList,泛型List具體比較

編輯:C#入門知識

C#中數組Array,ArrayList,泛型List具體比較。本站提示廣大學習愛好者:(C#中數組Array,ArrayList,泛型List具體比較)文章只能為提供參考,不一定能成為您想要的結果。以下是C#中數組Array,ArrayList,泛型List具體比較正文


在C#中數組Array,ArrayList,泛型List都可以或許存儲一組對象,然則在開辟中基本不曉得用哪一個機能最高,上面我們漸漸剖析剖析。

1、數組Array

數組是一個存儲雷同類型元素的固定年夜小的次序聚集。數組是用來存儲數據的聚集,平日以為數組是一個統一類型變量的聚集。

Array 類是 C# 中一切數組的基類,它是在 System 定名空間中界說。

數組在內存中是持續存儲的,所以它的索引速度異常快,並且賦值與修正元素也異常簡略。

Array數組詳細用法:

using System;

namespace WebApp
{
  class Program
  {
    static void Main(string[] args)
    {
      //System.Array
      //1、數組[] 特定類型、固定長度
      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]);
      //2、二維數組
      //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]);

      //3、多維數組
      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]);

      //4、交織數組即數組的數組
      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();
    }
  }
}

數組固然存儲檢索數據很快,然則也有一些缺陷:

1、在聲明數組的時刻必需指定命組的長度,假如不清晰數組的長度,就會變得很費事。

2、數組的長度太長,會形成內存糟蹋;太短會形成數據溢出的毛病。

3、在數組的兩個數據間拔出數據是很費事的

更多參考微軟官方文檔: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、總結

1、數組的容量固定,而ArrayList或List<T>的容量可依據須要主動擴大。

2、數組可有多個維度,而 ArrayList或 List< T> 一直只要一個維度。(可以創立數組列表或列表的列表)

3、特定類型的數組機能優於 ArrayList的機能(不包含Object,由於 ArrayList的元素是 Object ,在存儲或檢索值類型時平日產生裝箱和撤消裝箱操作)。

4、 ArrayList 和 List<T>根本等效,假如List< T> 類的類型T是援用類型,則兩個類的行動是完整雷同的。假如T是值類型,須要斟酌裝箱和拆箱形成的機能消耗。List<T> 是類型平安。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved