最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#?泛型集合類(lèi)List<T>使用總結(jié)

 更新時(shí)間:2022年05月29日 16:18:45   作者:握風(fēng)  
本文主要主要介紹了C#?泛型集合類(lèi)List<T>使用總結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧<BR>

C#中List可謂是使用最廣泛的一種數(shù)據(jù)類(lèi)型了,使用他來(lái)規(guī)范數(shù)據(jù)時(shí),往往會(huì)涉及到對(duì)數(shù)據(jù)的處理操作,相關(guān)處理數(shù)據(jù)方法也非常豐富,本文將簡(jiǎn)單介紹為何使用它,以及部分處理方法的靈活使用。

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

首先要說(shuō)下數(shù)組的局限性

(1) 數(shù)組中元素是固定的:類(lèi)型和數(shù)量都必須確定!一旦定義,無(wú)法改變其元素總數(shù)
(2) 如果使用數(shù)組類(lèi)型存儲(chǔ)數(shù)據(jù),一旦項(xiàng)目需求有變化,那必須修改原數(shù)組相關(guān)代碼,得不償失
(3) 如果數(shù)據(jù)總數(shù)非常大,那數(shù)組在定義時(shí)就要把長(zhǎng)度(即元素總數(shù))定義的非常大,造成了存儲(chǔ)空間的巨大浪費(fèi)!

而List跟數(shù)組比較,他可以動(dòng)態(tài)增減元素個(gè)數(shù),無(wú)任何限制,直接秒殺數(shù)組

當(dāng)然,實(shí)際項(xiàng)目開(kāi)發(fā)中,對(duì)于一些固定的枚舉值,類(lèi)型集合等,或相關(guān)數(shù)據(jù)處理中,使用數(shù)組還是相當(dāng)方便的,它并不是沒(méi)用的,而是相比較List,使用的空間小一些罷了(存在即有用?。?/p>

然后再說(shuō)下ArryList

這個(gè)直接截圖一下官網(wǎng)的相關(guān)建議

既然官網(wǎng)都不建議使用,那可見(jiàn)它真的不常用,而不是不能用
沒(méi)有使用價(jià)值的東西不會(huì)被留下來(lái)的,對(duì)吧!

跟List比較,他還是有一個(gè)優(yōu)點(diǎn)的,就是他可以存儲(chǔ)類(lèi)型不一樣的對(duì)象數(shù)據(jù),而List泛型集合類(lèi),其中T必須是對(duì)他存儲(chǔ)元素對(duì)象的約束,必須一致性!

ArrayList存儲(chǔ)的對(duì)象如果是值類(lèi)型,那就涉及到裝箱操作,這個(gè)對(duì)程序性能影響很大,所以不到萬(wàn)不得已,還是不要用!

而且ArrayList里面存放元素對(duì)象類(lèi)型都不一致,在C#(強(qiáng)類(lèi)型語(yǔ)言)中處理時(shí),還需要判斷,還要涉及到頻繁裝箱拆箱,性能不說(shuō),這不是自討苦吃嘛....

其實(shí)就跟強(qiáng)類(lèi)型語(yǔ)言和弱類(lèi)型語(yǔ)言一樣,如果把js比作弱類(lèi)型,那ts就是強(qiáng)類(lèi)型,js寫(xiě)起來(lái)很爽(var聲明變量時(shí),變量幾乎可以是任意類(lèi)型...),但是出現(xiàn)報(bào)錯(cuò)、異常,找起來(lái)會(huì)相當(dāng)麻煩,因?yàn)閷?xiě)的時(shí)候,約束的少,那最后運(yùn)行的時(shí)候,都會(huì)補(bǔ)回來(lái)的!而ts有類(lèi)型約束以后,寫(xiě)起來(lái)有了一些束手束腳,但是基本不會(huì)出錯(cuò),而且寫(xiě)多了都一樣!這就是大部分后端語(yǔ)言都是強(qiáng)類(lèi)型的一個(gè)重要原因吧(個(gè)人觀(guān)點(diǎn)....)!

List特點(diǎn):只能添加一種數(shù)據(jù)類(lèi)型,可以是基本的值類(lèi)型也可以實(shí)引用類(lèi)型,一旦數(shù)據(jù)類(lèi)型確定,不可更改!

List做數(shù)據(jù)處理時(shí),完全可以采用強(qiáng)大的Linq,處理起來(lái)那是相當(dāng)?shù)姆奖鉢

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

注:這里僅介紹當(dāng)List中T為引用類(lèi)型(對(duì)象)時(shí),基本類(lèi)型(值類(lèi)型)就不說(shuō)了,因?yàn)榭梢灾苯佑茫?...引用類(lèi)型則不行!

另外還一個(gè)類(lèi)型比較特殊,也要單獨(dú)拿出來(lái)提一嘴,就是string,在C#中它屬于引用類(lèi)型,但是它類(lèi)似于值類(lèi)型,可以直接進(jìn)行比較,在這完全可以歸屬到值類(lèi)型當(dāng)中了。

當(dāng)然使用Linq中GoupBy + Select等方法還是可以做到去重的,但是這里說(shuō)的并不是這些東西,而是直接使用Intersect、ExceptDistinct、Union

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

重寫(xiě)Equals() 和 GetHashCode()

為什么要重新呢,因?yàn)檫@些比較方法的內(nèi)部就是調(diào)用者兩個(gè)方法進(jìn)行比較的,他們僅適用于值類(lèi)型的比較,對(duì)象需要重寫(xiě)內(nèi)部邏輯了!

要想重寫(xiě),需要寫(xiě)一個(gè)類(lèi),繼承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();// 兩種寫(xiě)法都可以
    }
}

其實(shí)上面寫(xiě)法還是有點(diǎn)不嚴(yán)謹(jǐn)
(1)沒(méi)有null判斷,如果某一屬性值為空,那就可能拋異常
(2)并未將對(duì)象的所有屬性進(jìn)行比較,如上面,僅僅比較名稱(chēng)和年齡,那全國(guó)20歲叫張三的人肯定不止一個(gè),達(dá)不到目的了(這里僅僅是舉個(gè)例子,具體比較多少屬性,還是根據(jù)項(xiàng)目中實(shí)際情況而定的...如果有Id,那完全可以比較Id不是更快....)

把(1)加進(jìn)去重新寫(xiě)一遍

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();// 兩種寫(xiě)法都可以
    }
}

簡(jiǎn)單使用

  • 交集
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);
                //結(jié)果: 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();

//結(jié)果:
name:ls,age:10
name:ww,age:13
  • 并集
var _oj2 = _old.Union(_new, new MyComparer()).ToList();

//結(jié)果:
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();

//結(jié)果:
name:zs,age:21
name:ls,age:10
name:ww,age:13

到此這篇關(guān)于C# 泛型集合類(lèi)List<T>使用總結(jié)的文章就介紹到這了,更多相關(guān)C# 泛型List<T>內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

舒兰市| 拉萨市| 湘潭县| 南涧| 黑水县| 武鸣县| 永德县| 万年县| 株洲县| 通江县| 利川市| 武穴市| 乌拉特后旗| 三门峡市| 鹤壁市| 武乡县| 湘潭市| 班戈县| 桐乡市| 平乐县| 嘉禾县| 定兴县| 东平县| 宜章县| 策勒县| 稷山县| 太谷县| 巢湖市| 神池县| 任丘市| 福清市| 榆社县| 彭州市| 白玉县| 古田县| 常熟市| 福清市| 广州市| 光山县| 东港市| 喜德县|