中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#泛型集合類List<T>如何使用

發布時間:2022-05-30 09:17:46 來源:億速云 閱讀:225 作者:zzz 欄目:開發技術

這篇“C#泛型集合類List<T>如何使用”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“C#泛型集合類List<T>如何使用”文章吧。

為什么選擇使用List,而不是使用Array,或者ArryList

首先要說下數組的局限性

(1) 數組中元素是固定的:類型和數量都必須確定!一旦定義,無法改變其元素總數
(2) 如果使用數組類型存儲數據,一旦項目需求有變化,那必須修改原數組相關代碼,得不償失
(3) 如果數據總數非常大,那數組在定義時就要把長度(即元素總數)定義的非常大,造成了存儲空間的巨大浪費!

而List跟數組比較,他可以動態增減元素個數,無任何限制,直接秒殺數組

當然,實際項目開發中,對于一些固定的枚舉值,類型集合等,或相關數據處理中,使用數組還是相當方便的,它并不是沒用的,而是相比較List,使用的空間小一些罷了(存在即有用!)

然后再說下ArryList

這個直接截圖一下官網的相關建議

C#泛型集合類List<T>如何使用

既然官網都不建議使用,那可見它真的不常用,而不是不能用
沒有使用價值的東西不會被留下來的,對吧!

跟List比較,他還是有一個優點的,就是他可以存儲類型不一樣的對象數據,而List泛型集合類,其中T必須是對他存儲元素對象的約束,必須一致性!

ArrayList存儲的對象如果是值類型,那就涉及到裝箱操作,這個對程序性能影響很大,所以不到萬不得已,還是不要用!

而且ArrayList里面存放元素對象類型都不一致,在C#(強類型語言)中處理時,還需要判斷,還要涉及到頻繁裝箱拆箱,性能不說,這不是自討苦吃嘛....

其實就跟強類型語言和弱類型語言一樣,如果把js比作弱類型,那ts就是強類型,js寫起來很爽(var聲明變量時,變量幾乎可以是任意類型...),但是出現報錯、異常,找起來會相當麻煩,因為寫的時候,約束的少,那最后運行的時候,都會補回來的!而ts有類型約束以后,寫起來有了一些束手束腳,但是基本不會出錯,而且寫多了都一樣!這就是大部分后端語言都是強類型的一個重要原因吧(個人觀點....)!

List特點:只能添加一種數據類型,可以是基本的值類型也可以實引用類型,一旦數據類型確定,不可更改!

List做數據處理時,完全可以采用強大的Linq,處理起來那是相當的方便\

去重、交集、并集、差集操作

注:這里僅介紹當List中T為引用類型(對象)時,基本類型(值類型)就不說了,因為可以直接用!....引用類型則不行!

另外還一個類型比較特殊,也要單獨拿出來提一嘴,就是string,在C#中它屬于引用類型,但是它類似于值類型,可以直接進行比較,在這完全可以歸屬到值類型當中了。

當然使用Linq中GoupBy + Select等方法還是可以做到去重的,但是這里說的并不是這些東西,而是直接使用IntersectExceptDistinctUnion

那么為什么引用類型不能直接比較呢,其實稍微懂一點底層的都知道,引用類型,引用兩個字就道出了緣由!其值為一個引用地址,在棧內存中,地址是唯一的,但是也有可能兩個地址指向同一個堆中的值呢....
因此要想比較,先把他的值點出來比較,可以只比較某一個值,也可以是全部

重寫Equals() 和 GetHashCode()

為什么要重新呢,因為這些比較方法的內部就是調用者兩個方法進行比較的,他們僅適用于值類型的比較,對象需要重寫內部邏輯了!

要想重寫,需要寫一個類,繼承IEqualityComparer接口即可

public class MyComparer : IEqualityComparer<Person>
{
    public bool Equals([AllowNull] Person x, [AllowNull] Person y)
    {
        return x.name == y.name && x.age == y.age;
    }

    public int GetHashCode([DisallowNull] Person obj)
    {
        return obj.name.GetHashCode() + obj.age.GetHashCode();
        //return obj.name.GetHashCode() ^ obj.age.GetHashCode();// 兩種寫法都可以
    }
}

其實上面寫法還是有點不嚴謹
(1)沒有null判斷,如果某一屬性值為空,那就可能拋異常
(2)并未將對象的所有屬性進行比較,如上面,僅僅比較名稱和年齡,那全國20歲叫張三的人肯定不止一個,達不到目的了(這里僅僅是舉個例子,具體比較多少屬性,還是根據項目中實際情況而定的...如果有Id,那完全可以比較Id不是更快....)

把(1)加進去重新寫一遍

public class MyComparer : IEqualityComparer<Person>
{
    public bool Equals([AllowNull] Person x, [AllowNull] Person y)
    {
        if(x == null || y == null) return false;
        if(x.name == y.name && x.age == y.age) return true;
        return false;
    }

    public int GetHashCode([DisallowNull] Person obj)
    {
        if(obj == null) return 0;
        return obj.name.GetHashCode() + obj.age.GetHashCode();
        //return obj.name.GetHashCode() ^ obj.age.GetHashCode();// 兩種寫法都可以
    }
}

簡單使用

  • 交集

using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            //交集:集合A.Intersect(集合B)
            var _old = new List<Person> {
                new Person{name="zs",age=21},
                new Person{name="ls",age=10},
                new Person{name="ww",age=13},
                new Person{name="ls",age=10},
                new Person{name="ww",age=13}
            };
            var _new = new List<Person> {
                new Person{name="zs",age=21},
                new Person{name="ls",age=31},
                new Person{name="ww3",age=13}
            };
            var _obj = _old.Intersect(_new,new MyComparer()).ToList();
            for (int i = 0; i < _obj.Count; i++)
            {
                var x = _obj[i];
                Console.WriteLine("name:{0},age:{1}", x.name, x.age);
                //結果: name:zs,age:21
            }
            Console.ReadLine();
        }
    }
    public class Person
    {
        public string name { get; set; }
        public int age { get; set; }
    }
}
  • 差集

var _oj2 = _old.Except(_new, new MyComparer()).ToList();

//結果:
name:ls,age:10
name:ww,age:13
  • 并集

var _oj2 = _old.Union(_new, new MyComparer()).ToList();

//結果:
name:zs,age:21
name:ls,age:10
name:ww,age:13
name:ls,age:31
name:ww3,age:13
  • 去重

var _oj2 = _old.Distinct(new MyComparer()).ToList();

//結果:
name:zs,age:21
name:ls,age:10
name:ww,age:13

以上就是關于“C#泛型集合類List<T>如何使用”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

老河口市| 内黄县| 德惠市| 张家口市| 顺义区| 绍兴县| 湘阴县| 栖霞市| 砀山县| 区。| 平乐县| 东光县| 库车县| 诸暨市| 盐亭县| 北川| 喀喇沁旗| 类乌齐县| 广灵县| 竹山县| 太康县| 雷州市| 泸西县| 奎屯市| 太白县| 凤冈县| 昌都县| 靖西县| 长丰县| 静安区| 唐山市| 乌兰县| 潮州市| 武宁县| 丰镇市| 嘉黎县| 嘉荫县| 巴楚县| 泗阳县| 平利县| 黑山县|