[c#筆記]所以為甚麼T[]有Length屬性HashSet<T>卻沒有

 

前言: 

最近面試一直撞牆 打工又不能停 
搞得身心俱疲((這不是不寫筆記藉口 草稿夾那4篇啥時要解決 (笑
但原地踏步是不行的 之前報名某C# backend培訓計畫 在HR面試被刷掉了QQ
想說那我就自學C#好了 然後就又開始刷題地獄...

正文: 


近日在練習C# 的各種 container
某天在刷LeetCode 26. 的時候

我: 也太簡單了八www, 丟到set再走訪寫回原本的array就好了, 時間複雜度 O(n) 解決

開心按下run結果:
does not contain a definition for 'Length' and...
恩...身為C#小白, 第一個想的一定是這題怎麼那麼多倒讚 肯定沒有讀熟文件
於是打開HashSet文件一看 啊哈 肯定是這個屬性:

改完送出 收工!
but!!
用不求甚解的態度學習 是很難成為大佬的
所以來觀察之間的關係

首先來看看HashSet文件:
public class HashSet<T> : ICollection<T>,
IEnumerable<T>, IEnumerable,
IReadOnlyCollection<T>, ISet<T>,
IReadOnlySet<T>, IDeserializationCallback,
ISerializable

其中ICollection<T>文件內我們可以在properties的表格看到有 Count 這個屬性

然後我看了看其他繼承的介面 都找沒有Length這個屬性...

所以有可能只有Array才有 那我們來看看Array implement 了那些介面八
Array文件的屬性表格可以看到 Length 屬性出現了

往上滑一些可以注意到 : 

public abstract class Array : ICollection,
IEnumerable, IList,
IStructuralComparable, IStructuralEquatable,
ICloneable

Array你小子也有繼承ICollection 所以照理來講 Array也可以用Count取得陣列長度
於是我們有下面的實驗:

int[] nums = {1, 2, 3, 4};
System.Collections.ICollection p = nums;
Console.WriteLine(nums.Length);
Console.WriteLine(p.Count);

輸出結果為:

> dotnet script test.cs
4
4
>

跟預期的一樣

結論:
文件指引蒼生

Array抽象類別雖然不在System.Collection底下
但有實作ICollection, IList等介面 所以可以爽爽用 HashSet, Dictionary等類別的建構子
來建立想要用的container
跟用c++ STL 一樣爽爽的

留言

這個網誌中的熱門文章

[android]QR code掃描