<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
C#中List可謂是使用最廣泛的一種資料型別了,使用他來規範資料時,往往會涉及到對資料的處理操作,相關處理資料方法也非常豐富,本文將簡單介紹為何使用它,以及部分處理方法的靈活使用。
首先要說下陣列的侷限性
(1) 陣列中元素是固定的:型別和數量都必須確定!一旦定義,無法改變其元素總數
(2) 如果使用陣列型別儲存資料,一旦專案需求有變化,那必須修改原陣列相關程式碼,得不償失
(3) 如果資料總數非常大,那陣列在定義時就要把長度(即元素總數)定義的非常大,造成了儲存空間的巨大浪費!
而List跟陣列比較,他可以動態增減元素個數,無任何限制,直接秒殺陣列
當然,實際專案開發中,對於一些固定的列舉值,型別集合等,或相關資料處理中,使用陣列還是相當方便的,它並不是沒用的,而是相比較List,使用的空間小一些罷了(存在即有用!)
然後再說下ArryList
這個直接截圖一下官網的相關建議
既然官網都不建議使用,那可見它真的不常用,而不是不能用
沒有使用價值的東西不會被留下來的,對吧!
跟List比較,他還是有一個優點的,就是他可以儲存型別不一樣的物件資料,而List泛型集合類,其中T必須是對他儲存元素物件的約束,必須一致性!
ArrayList儲存的物件如果是值型別,那就涉及到裝箱操作,這個對程式效能影響很大,所以不到萬不得已,還是不要用!
而且ArrayList裡面存放元素物件型別都不一致,在C#(強型別語言)中處理時,還需要判斷,還要涉及到頻繁裝箱拆箱,效能不說,這不是自討苦吃嘛....
其實就跟強型別語言和弱型別語言一樣,如果把js比作弱型別,那ts就是強型別,js寫起來很爽(var宣告變數時,變數幾乎可以是任意型別...),但是出現報錯、異常,找起來會相當麻煩,因為寫的時候,約束的少,那最後執行的時候,都會補回來的!而ts有型別約束以後,寫起來有了一些束手束腳,但是基本不會出錯,而且寫多了都一樣!這就是大部分後端語言都是強型別的一個重要原因吧(個人觀點....)!
List特點:只能新增一種資料型別,可以是基本的值型別也可以實參照型別,一旦資料型別確定,不可更改!
List做資料處理時,完全可以採用強大的Linq,處理起來那是相當的方便
注:這裡僅介紹當List中T為參照型別(物件)時,基本型別(值型別)就不說了,因為可以直接用!....參照型別則不行!
另外還一個型別比較特殊,也要單獨拿出來提一嘴,就是string,在C#中它屬於參照型別,但是它類似於值型別,可以直接進行比較,在這完全可以歸屬到值型別當中了。
當然使用Linq中GoupBy + Select等方法還是可以做到去重的,但是這裡說的並不是這些東西,而是直接使用
Intersect
、Except
、Distinct
、Union
那麼為什麼參照型別不能直接比較呢,其實稍微懂一點底層的都知道,參照型別,參照兩個字就道出了緣由!其值為一個參照地址,在棧記憶體中,地址是唯一的,但是也有可能兩個地址指向同一個堆中的值呢....
因此要想比較,先把他的值點出來比較,可以只比較某一個值,也可以是全部
為什麼要重新呢,因為這些比較方法的內部就是呼叫者兩個方法進行比較的,他們僅適用於值型別的比較,物件需要重寫內部邏輯了!
要想重寫,需要寫一個類,繼承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>使用總結的文章就介紹到這了,更多相關C# 泛型List<T>內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45