C#中數(shù)組Array,ArrayList,泛型List詳細對比
在C#中數(shù)組Array,ArrayList,泛型List都能夠存儲一組對象,但是在開發(fā)中根本不知道用哪個性能最高,下面我們慢慢分析分析。
一、數(shù)組Array
數(shù)組是一個存儲相同類型元素的固定大小的順序集合。數(shù)組是用來存儲數(shù)據(jù)的集合,通常認(rèn)為數(shù)組是一個同一類型變量的集合。
Array 類是 C# 中所有數(shù)組的基類,它是在 System 命名空間中定義。
數(shù)組在內(nèi)存中是連續(xù)存儲的,所以它的索引速度非常快,而且賦值與修改元素也非常簡單。
Array數(shù)組具體用法:
using System;
namespace WebApp
{
class Program
{
static void Main(string[] args)
{
//System.Array
//1、數(shù)組[] 特定類型、固定長度
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、二維數(shù)組
//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、多維數(shù)組
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、交錯數(shù)組即數(shù)組的數(shù)組
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();
}
}
}
數(shù)組雖然存儲檢索數(shù)據(jù)很快,但是也有一些缺點:
1、在聲明數(shù)組的時候必須指定數(shù)組的長度,如果不清楚數(shù)組的長度,就會變得很麻煩。
2、數(shù)組的長度太長,會造成內(nèi)存浪費;太短會造成數(shù)據(jù)溢出的錯誤。
3、在數(shù)組的兩個數(shù)據(jù)間插入數(shù)據(jù)是很麻煩的
更多參考微軟官方文檔:Array 類 (System)
二、ArrayList
既然數(shù)組有很多缺點,C#就提供了ArrayList對象來克服這些缺點。
ArrayList是在命名空間System.Collections下,在使用該類時必須進行引用,同時繼承了IList接口,提供了數(shù)據(jù)存儲和檢索。
ArrayList對象的大小是按照其中存儲的數(shù)據(jù)來動態(tài)擴充與收縮的。因此在聲明ArrayList對象時并不需要指定它的長度。
ArrayList 的默認(rèn)初始容量為 0。隨著元素添加到 ArrayList 中,容量會根據(jù)需要通過重新分配自動增加??赏ㄟ^調(diào)用 TrimToSize 或通過顯式設(shè)置 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();
}
}
運行結(jié)果:
ArrayList解決了數(shù)組中所有的缺點,但是在存儲或檢索值類型時通常發(fā)生裝箱和取消裝箱操作,帶來很大的性能耗損。尤其是裝箱操作,例如:
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中插入不同類型的數(shù)據(jù)是允許的。因為ArrayList會把所有插入其中的數(shù)據(jù)當(dāng)作為object類型來處理,在使用ArrayList處理數(shù)據(jù)時,很可能會報類型不匹配的錯誤,也就是ArrayList不是類型安全的。
更多參考微軟官方ArrayList文檔:ArrayList 類 (System.Collections)
三、泛型List<T>
由于ArrayList存在不安全類型與裝箱拆箱的缺點,所以出現(xiàn)了泛型的概念。
List 類是 ArrayList 類的泛型等效類。該類使用大小可按需動態(tài)增加的數(shù)組實現(xiàn) IList 泛型接口,大部分用法都與ArrayList相似。
List<T> 是類型安全的,在聲明List集合時,必須為其聲明List集合內(nèi)數(shù)據(jù)的對象類型。
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集合內(nèi)數(shù)據(jù)的對象類型是string,然后往List集合中插入int類型的111,IDE就會報錯,且不能通過編譯。顯然這樣List<T>是類型安全的。
對返回結(jié)果集再封裝:
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泛型類
四、總結(jié)
1、數(shù)組的容量固定,而ArrayList或List<T>的容量可根據(jù)需要自動擴充。
2、數(shù)組可有多個維度,而 ArrayList或 List< T> 始終只有一個維度。(可以創(chuàng)建數(shù)組列表或列表的列表)
3、特定類型的數(shù)組性能優(yōu)于 ArrayList的性能(不包括Object,因為 ArrayList的元素是 Object ,在存儲或檢索值類型時通常發(fā)生裝箱和取消裝箱操作)。
4、 ArrayList 和 List<T>基本等效,如果List< T> 類的類型T是引用類型,則兩個類的行為是完全相同的。如果T是值類型,需要考慮裝箱和拆箱造成的性能損耗。List<T> 是類型安全。
上一篇:FTPClientHelper輔助類 實現(xiàn)文件上傳,目錄操作,下載等操作
欄 目:C#教程
下一篇:C#用遞歸算法實現(xiàn):一列數(shù)的規(guī)則如下: 1、1、2、3、5、8、13、21、34,求第30位數(shù)是多少
本文標(biāo)題:C#中數(shù)組Array,ArrayList,泛型List詳細對比
本文地址:http://www.jygsgssxh.com/a1/C_jiaocheng/6429.html
您可能感興趣的文章
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并打開的方法
- 01-10C#實現(xiàn)Winform中打開網(wǎng)頁頁面的方法
- 01-10C#實現(xiàn)由四周向中心縮小的窗體退出特效
- 01-10Extjs4如何處理后臺json數(shù)據(jù)中日期和時間
- 01-10C#中DataGridView常用操作實例小結(jié)
- 01-10C#編程獲取資源文件中圖片的方法
- 01-10asp.net中XML如何做增刪改查操作
- 01-10C#利用反射技術(shù)實現(xiàn)去掉按鈕選中時的邊框效果
- 01-10c# ArrayList的使用方法小總結(jié)
- 01-10C#中查找Dictionary中的重復(fù)值的方法


閱讀排行
本欄相關(guān)
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實現(xiàn)txt定位指定行完整實例
- 01-10WinForm實現(xiàn)仿視頻播放器左下角滾動新
- 01-10C#停止線程的方法
- 01-10C#實現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實現(xiàn)讀取注冊表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機閱讀
- 01-10C#中split用法實例總結(jié)
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-11ajax實現(xiàn)頁面的局部加載
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10delphi制作wav文件的方法
- 04-02jquery與jsp,用jquery
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 08-05織夢dedecms什么時候用欄目交叉功能?


