首頁 後端開發 C#.Net教程 C# list使用方法

C# list使用方法

Dec 15, 2016 pm 03:26 PM

集合是OOP中的重要概念,C#中對集合的全面支持更是該語言的精華之一。

    為什麼要用泛型集合?

    在C# 2.0之前,主要可以透過兩種方式實現集合:

    a.使用ArrayList

    直接將物件放入ArrayList,操作直觀項,但由於集合中

    直接將物件放入ArrayList,操作直觀項,但由於集合中的來源是必須使用進行繁瑣的類型轉換。

    b.使用自訂集合類別

    較常見的做法是從CollectionBase抽象類別繼承自訂類別,並透過對IList物件進行封裝實現強型別集合。這種方式要求為每種集合類型寫一個對應的自訂類,工作量較大。泛型集合的出現較好的解決了上述問題,只需一行程式碼就能建立指定類型的集合。

    什麼是泛型?

    泛型是C# 2.0中的新增元素(C++中稱為模板),主要用於解決一系列類似的問題。這種機制允許將類別名稱作為參數傳遞給泛型類型,並產生相應的物件。將泛型(包括類別、介面、方法、委託等)看作模板可能會更好理解,模板中的變體部分將被作為參數傳進來的類別名稱所代替,從而得到一個新的類型定義。泛型是比較大的話題,在此不作詳細解析,有興趣者可以查閱相關資料。



    怎麼建立泛型集合?

    主要利用System.Collections.Generic命名空間下面的List泛型類別建立集合,語法如下:

定義Person類別如下:

   可以看到,泛型集合中大大簡化了集合的實作程式碼,透過它,可以輕鬆創建指定類型的集合。非但如此,泛型集合也提供了更強大的功能,以下來看其中的排序及搜尋。

List ListOfT = new List();

其中的"T"就是所要使用的類型,既可以是簡單類型,如string、int,也可以是使用者自訂類型。下面看一個具體例子。


class Person

{

    private string _name; //姓名

    private int _name; //姓名

    private int_age; //年齡創建物_ string Name, int Age)

    {

        this._name= Name;

        this._age = Age;

     {

        get { return _name; }

    }

    //年齡

int Age

    {

        get { return _age; }

    }

}

//Personme"p Person p2 = new Person( "李四", 20);

Person p3 = new Person("王五", 50);

//建立類型為Person的物件集合

List persons = new List() ;

//將Person物件放入集合

persons.Add(p1);

persons.Add(p2);

persons.Add(p3);

//輸出第2個人的名字

Console.Write(persons[1].Name);

    泛型集合的排序

    排序基於比較,要排序,首先要比較。例如有兩個數1、2,要對他們排序,首先就要比較這兩個數,依照比較結果來排序。如果要比較的是對象,情況就要複雜一點,例如對Person對象進行比較,則既可以按姓名進行比較,也可以按年齡進行比較,這就需要確定比較規則。一個物件可以有多個比較規則,但只能有一個預設規則,預設規則放在定義該物件的類別中。預設比較規則在CompareTo方法中定義,該方法屬於IComparable泛型介面。請看下面的程式碼:

class Person :IComparable

{

    //依年齡比較

   p.Age;

}

}

    CompareTo方法的參數為另一個要比較的同類型對象,則返回值為int型,若傳回值大於0,表示第一個物件大於第二個對象,若傳回值小於0,表示第一個對像小於第二個對象,如果返回0,則兩個對象相等。

定義好預設比較規則後,就可以透過不帶參數的Sort方法對集合進行排序,如下所示:

//依照預設規則對集合進行排序

persons.Sort();

//輸出所有人姓名

foreach (Person p in persons)

{

    Console.WriteLine(p.Name); //輸出次序為"李四"、"張三"、"王五"

}

    實際使用中,經常需要對集合按照多種不同規則進行排序,這就需要定義其他比較規則,可以在Compare方法中定義,該方法屬於IComparer泛型接口,請看下面的程式碼:

class NameComparer : IComparer

{

    //存放排序器實例

    public static NameComparer Default = new NameCompara) public int Compare(Person p1, Person p2)

    {

        return System.Collections.Comparer.Default.Compare(p1.Name, p2.Name); Comp  物件,傳回值為int類型,傳回值處理規則與CompareTo方法相同。其中的Comparer.Default傳回一個內建的Comparer對象,用於比較兩個同類型物件。

    下面用新定義的這個比較器對集合進行排序:

    也可以透過委託來進行集合排序,首先要定義一個供委託呼叫的方法,用來存放比較規則,可以用靜態方法。請看下面的程式碼:然後透過內建的泛型委託System.Comparison對集合進行排序:

    可以看到,後兩種方式都可以對集合按照指定規則進行排序,但筆者更偏向於使用委託方式,可以考慮把各種比較規則放在一個類別中,然後再進行靈活呼叫。

//依照姓名對集合排序

persons.Sort(NameComparer.Default);

//輸出所有人姓名

foreach (Person p in persons)

{

foreach (Person p in persons)

{

); //輸出順序為"李四"、"王五"、"張三"

}class PersonComparison

{

    //以姓名比較

    public static int Name p1

    {

        return System.Collections.Comparer.Default.Compare(p1.Name, p2.Name);

  類型,傳回值處理規則與CompareTo方法相同。

System.Comparison NameComparison = new System.Comparison(PersonComparison.Name);

persons.Sort(NameComparison);

//輸出所有人

forons

{

    Console.WriteLine(p.Name); //輸出順序為"李四"、"王五"、"張三"

}

可以看到,後兩種方式都可以對集合按照指定規則進行排序,但筆者更偏向於使用委託方式,可以考慮把各種比較規則放在一個類別中,然後進行靈活呼叫。

    泛型集合的搜尋

    搜尋就是從集合中找出符合特定條件的項,可以定義多個搜尋條件,並視需要進行呼叫。首先,定義搜尋條件,如下圖:

class PersonPredicate

{

    //找出中年人(40歲以上)

   if (p. Age >= 40)

            return true;

          

}

    上面的搜尋條件放在一個靜態方法中,方法的回傳類型為布林型,集合中滿足特定條件的項回傳true,否則回傳false。

System.Predicate MidAgePredicate = new System.Predicate(PersonPredicate.MidAge);

List MidAgePersons = persons.FindAll(MidAgePredicate);Predicate);

foreach (Person p in MidAgePersons)

{

    Console.WriteLine(p.Name); //輸出"王五"

}然後透過內建的泛型委託System.Predicate對集合進行搜尋:

    

    泛型集合的延伸

    若要取得集合中所有人的姓名,中間以逗號隔開,那該怎麼處理?

    考慮到單一類別可以提供的功能是有限的,很自然會想到對List類別進行擴展,泛型類別也是類,因此可以透過繼承來擴展。請看下面的程式碼:

//定義Persons集合類別

class Persons : List

{

    //取得集合中所有人姓名

public public stringat      if ( this.Count == 0)

            return "";

            {

            val += p.Name + ",";

        }

        return val.Substring(0, val.Length - 1);

    }

}

//建立並填

PersonCol.Add(p2);

PersonCol.Add(p3);

//輸出所有人名稱

Console.Write(PersonCol.GetAllNames()); //輸出「張三,李四,王五王五”

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中元素的實際數量

小結:於介紹運用C# 2.0中的泛型來實現集合,以及對集合功能進行擴展,恰當的運用泛型集合,可以減少很多重複工作,極大的提高開發效率。實際上,集合只不過是泛型的典型應用,如果想了解更多關於泛型的知識,可以查閱其他相關資料。希望本文對你有用

更多C# list使用方法相關文章請關注PHP中文網!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1665
14
CakePHP 教程
1424
52
Laravel 教程
1322
25
PHP教程
1270
29
C# 教程
1250
24
c#.net的持續相關性:查看當前用法 c#.net的持續相關性:查看當前用法 Apr 16, 2025 am 12:07 AM

C#.NET依然重要,因為它提供了強大的工具和庫,支持多種應用開發。 1)C#結合.NET框架,使開發高效便捷。 2)C#的類型安全和垃圾回收機制增強了其優勢。 3).NET提供跨平台運行環境和豐富的API,提升了開發靈活性。

從網絡到桌面:C#.NET的多功能性 從網絡到桌面:C#.NET的多功能性 Apr 15, 2025 am 12:07 AM

C#.NETisversatileforbothwebanddesktopdevelopment.1)Forweb,useASP.NETfordynamicapplications.2)Fordesktop,employWindowsFormsorWPFforrichinterfaces.3)UseXamarinforcross-platformdevelopment,enablingcodesharingacrossWindows,macOS,Linux,andmobiledevices.

C#作為多功能.NET語言:應用程序和示例 C#作為多功能.NET語言:應用程序和示例 Apr 26, 2025 am 12:26 AM

C#在企業級應用、遊戲開發、移動應用和Web開發中均有廣泛應用。 1)在企業級應用中,C#常用於ASP.NETCore開發WebAPI。 2)在遊戲開發中,C#與Unity引擎結合,實現角色控制等功能。 3)C#支持多態性和異步編程,提高代碼靈活性和應用性能。

c#.net適合您嗎?評估其適用性 c#.net適合您嗎?評估其適用性 Apr 13, 2025 am 12:03 AM

c#.netissutableforenterprise-levelapplications withemofrosoftecosystemdueToItsStrongTyping,richlibraries,androbustperraries,androbustperformance.however,itmaynotbeidealfoross-platement forment forment forment forvepentment offependment dovelopment toveloperment toveloperment whenrawspeedsportor whenrawspeedseedpolitical politionalitable,

C#.NET與未來:適應新技術 C#.NET與未來:適應新技術 Apr 14, 2025 am 12:06 AM

C#和.NET通過不斷的更新和優化,適應了新興技術的需求。 1)C#9.0和.NET5引入了記錄類型和性能優化。 2).NETCore增強了雲原生和容器化支持。 3)ASP.NETCore與現代Web技術集成。 4)ML.NET支持機器學習和人工智能。 5)異步編程和最佳實踐提升了性能。

.NET中的C#代碼:探索編程過程 .NET中的C#代碼:探索編程過程 Apr 12, 2025 am 12:02 AM

C#在.NET中的編程過程包括以下步驟:1)編寫C#代碼,2)編譯為中間語言(IL),3)由.NET運行時(CLR)執行。 C#在.NET中的優勢在於其現代化語法、強大的類型系統和與.NET框架的緊密集成,適用於從桌面應用到Web服務的各種開發場景。

將C#.NET應用程序部署到Azure/AWS:逐步指南 將C#.NET應用程序部署到Azure/AWS:逐步指南 Apr 23, 2025 am 12:06 AM

如何將C#.NET應用部署到Azure或AWS?答案是使用AzureAppService和AWSElasticBeanstalk。 1.在Azure上,使用AzureAppService和AzurePipelines自動化部署。 2.在AWS上,使用AmazonElasticBeanstalk和AWSLambda實現部署和無服務器計算。

C#和.NET運行時:它們如何一起工作 C#和.NET運行時:它們如何一起工作 Apr 19, 2025 am 12:04 AM

C#和.NET運行時緊密合作,賦予開發者高效、強大且跨平台的開發能力。 1)C#是一種類型安全且面向對象的編程語言,旨在與.NET框架無縫集成。 2).NET運行時管理C#代碼的執行,提供垃圾回收、類型安全等服務,確保高效和跨平台運行。

See all articles