方描述
Unit that implements generic container classes to group data items in arrays, dictionaries, lists, stacks, queues, and more.
譯文:實現泛型容器類的單元,以在數組中對數據項進行分組,詞典,列表,堆棧,隊列等。
起初在接觸到Delphi的時候我以為沒有這一部分內容,所有的都要自己實現,此處請原諒我的無知。。。。
關于從那個版本開始支持泛型的,我在官方文檔上沒有找到對應的說明,也可能是我英語太菜,在官網迷路了。
根據百度得來的結果2007的版本沒有(真百度的)支持2009的版本(萬一老師的博客上引用的也是這個版本)開始出現,也就是最早支持泛型容器的版本應該是Delphi2009
聊泛型容器避不開的就是泛型的概念,之前看嗶哩嗶哩的網友留言從泛型一節就是開始懵逼了。其實大可不必,泛型可以理解為一個變量,它的值是一個具體的類型
嗯,其實也可以把它當作孫大圣,它可以變成任何東西
在這個單元內一共定義了13個容器類,我們在其中甚至可以看到線程隊列。那么問題來了,我們需要精通或者學習所有的類嗎?答案是否定的
容器類就我個人的理解其實一共有兩大表現形式,一種是列表形式的像數組,而另一種形式則以 Key,Value 成對的形式。也就是說我們從中選擇兩個比較有代表性的類進行學習即可。下面是我選擇的兩個類
注意:在單元內我們還可以看到相似的類例如 System.Generics.Collections.TObjectList<T> 和 System.Generics.Collections.TList<T>區別在于帶有Object的類會在刪除元素時釋放對象,而沒有帶Object的不會釋放
針對容器類學習的總原則是圍繞增、刪、改、查這幾個核心的API功能即可,其他的就只能現用現查了,不知道別人寫代碼是什么習慣,我寫代碼的時候幫助文檔基本上都是開著的。。。
下面是針對兩個容器類的代碼實現
實體類(TStudent)代碼
type
TStudent=class
private
FName: string;
public
property Name: string read FName write FName;
// 構造方法
constructor Create; overload;
// 有參構造方法
constructor Create(FName: string); overload;
end;
constructor TStudent.Create;
begin
end;
constructor TStudent.Create(FName: string);
begin
Self.FName :=FName;
end;
操作類(即增、刪、改、查),我沒有使用內聯,幾次想用都刪了
uses
System.Generics.Collections, System.SysUtils;
var
// 文檔上的定義是TList<T>,而我們的定義尖括號中的是TStudent,這就是泛型的用法
StudentList: TList<TStudent>;
// 循環中使用獲取TList成員
Stu: TStudent;
begin
// 初始化學生列表
StudentList :=TList<TStudent>.Create;
StudentList.add(TStudent.Create('小強'));
StudentList.add(TStudent.Create('蕭薔'));
StudentList.add(TStudent.Create('小黑'));
StudentList.add(TStudent.Create('小白'));
StudentList.add(TStudent.Create('小黃'));
// 開始之前輸出一次
for Stu in StudentList do begin
Writeln('學生信息是:' + Stu.Name);
end;
// 泛型容器自帶的刪除函數,偷個懶
StudentList.Delete(0);
// 修改,查詢到指定的學生,修改其值即可
StudentList.Items[0].Name :='小白';
// 查詢,其實和數組的操作沒有太大區別
for Stu in StudentList do begin
Writeln('學生信息是:' + Stu.Name);
end;
end.
此類容器的特點是 key 唯一,并且幾乎所有的操作都是根據 key 來的
改造下實體類(TStudent)增加一個屬性,代碼如下
type
TStudent=class
private
FName: string;
FId: string;
public
property Name: string read FName write FName;
property Id: string read FId write FId;
// 構造方法
constructor Create; overload;
// 有參構造方法
constructor Create(FName: string; FId: string); overload;
end;
constructor TStudent.Create;
begin
end;
constructor TStudent.Create(FName: string; FId: string);
begin
Self.FName :=FName;
end;
操作類(即增、刪、改、查)
{注意單元的引用}
uses
System.Generics.Collections, System.SysUtils;
var
// 文檔上的定義是TList<T>,而我們的定義尖括號中的是TStudent,這就是泛型的用法
StudentMap: TDictionary<string, TStudent>;
// 循環中使用獲取TList成員
Key: string;
Student,Stu: TStudent;
begin
// 初始化學生列表
StudentMap :=TDictionary<string, TStudent>.Create;
// 此處的添加其實并不是太好,根據文檔描述,當我們添加的元素的key已經存在會拋出異常
// 建議使用AddOrSetValue
StudentMap.add('1001', TStudent.Create('1002', '小強'));
StudentMap.add('1002', TStudent.Create('1001', '蕭薔'));
StudentMap.add('1003', TStudent.Create('1003', '小黑'));
StudentMap.add('1004', TStudent.Create('1004', '小白'));
StudentMap.add('1005', TStudent.Create('1004', '小黃'));
// 注意此處獲取是key,也就是1001 1002這些東西
for Key in StudentMap.Keys do begin
// 獲取到key之后,再根據key獲取對應value也就是學生對象
// 這里的獲取方式有點兒任性居然要的是一個指針,而不是直接返回
StudentMap.TryGetValue(Key, Student);
// 最好判斷一下,否則容易出現空指針
if (Student <> nil) then
Writeln('學生信息是:' + Student.Name)
end;
// 刪除元素,無論什么操作都是通過key去操作,因為key是不可以重復的
StudentMap.Remove('1005');
// 修改,沒有就添加,有就更新
StudentMap.AddOrSetValue('1004', TStudent.Create('1004', '小黃'));
// 直接獲取value
for Stu in StudentMap.values do begin
// 最好判斷一下,否則容易出現空指針
if (Stu <> nil) then
Writeln('學生信息是:' + Student.Name)
end;
end.
萬一的博客:https://www.cnblogs.com/del/category/113556.html
官方文檔:http://docwiki.embarcadero.com/Libraries/Sydney/en/System.Generics.Collections
ttp://www.gotapi.com/
語言:英語
簡介:HTML,CSS,XPATH,XSL,JAVASCRIPT等API的查詢網站。
http://www.w3schools.com/
語言:英語
簡介:W3C制定的標準諸如XML,HTML,XSL等等的在線學習教程。
http://www.xml.org.cn/
語言:中文
簡介:可以說是XML的中國官方網吧。W3C標準的翻譯組織與XML系列技術交流社區.
http://www.connectionstrings.com/
語言:英語
簡介:這里幾乎收集了所有的數據庫連接字符(connectionstring)了。
http://www.itpub.net/
語言:中文
簡介:我個人認為是國內最專業的綜合性行業性技術類社區.
http://www.netvtm.com/
語言:中文
簡介:內容多翻譯于w3schools.com,少有原創。不過還是應該鼓勵精品翻譯。
http://www.regexlib.com
語言:英語
簡介:正則表達式庫。搜索正則表達式用。
http://www.rexv.org/
語言:英語
簡介:用Ajax開發的在線正則表達式驗證器.
http://www.koders.com/
語言:英語
簡介:代碼搜索引擎,可以搜索幾十種語言的代碼。
http://www.123aspx.com/Rotor/
語言:英語
簡介:.Net Frameworks的源代碼。
語言:中文
簡介:孟憲會的資料站,雖資料大多比較簡單,卻解決了開發中的大部分問題?!
http://www.dofactory.com/Patterns/Patterns.aspx
語言:英語
簡介:23種設計模式的實現參考。特點是UML+精練的示例代碼+簡潔的解說風格。
http://www.open-open.com/
語言:中文
簡介:Java開源大全,如果你用.NET,照著它的名字前加N找找應該都有吧 ?!:)
http://www.riacn.com/
語言:中文
簡介:我認為是國內少有的RIA專業技術站于交流社區.
http://www.cnpaf.net/
語言:中文
簡介:中國協議分析網,很全面的協議資料網。
http://www.pinvoke.net/
語言:英語
簡介:通過.net調用win32等非受控API的資料大全。
http://bbs.51js.com/
語言:中文
簡介:無憂腳本,專業的腳本技術社區。
http://www.c-sharpcorner.com/
語言:英語
簡介:C# Corner,學習c#的好地方.
http://blog.csdn.net/group/experts/
語言:中文
簡介:CSDN專家群,匯集CSDN專家的電子報.
http://www.codeproject.com/
語言:英語
簡介:有很多可學習的示例代碼,特點是豐富,深入淺出.
http://www.gotdotnet.com/
語言:英語
簡介:微軟開發維護的關于.net framework交流社區.
http://www.sourceforge.net/
語言:英語
簡介:全球最大的開源軟體站點
http://www.asp.net/QuickStart/
語言:英語
簡介:Microsoft .NET Framework SDK QuickStart Tutorials
http://www.matrix.org.cn/
語言:中文
簡介:與 Java 共舞,Java優秀的專業社區,文章質量很高.做.Net的朋友也可以從其借鑒很多知識.
JAVA學習模板——學習流程
http://www.7zcn.com/javastep/StudyJavaInfo.html
SUN中國技術社區
http://developers.sun.com.cn/
綜合網站 -
數動在線http://www.shudoo.com/(電腦報) -http://www.csdn.net/ -
比特網IT知識庫http://know.chinabyte.com/index.php/%E9%A6%96%E9%A1%B5 -
至頂網http://www.zdnet.com.cn/ -
計世網http://www.ccw.com.cn/ -
中國IT實驗室http://www.chinaitlab.com/ -
天極網http://www.yesky.com/ -
賽迪網http://www.ccidnet.com/ -
全球流量查詢http://www.alexa.com/ -
Java網站 -
Java軟件社區http://www.javaeye.com/ -
java世紀網http://www.java2000.net/ -
JAVABUGShttp://bugs.sun.com/JAVA漏洞 -
http://www.mldnjava.cn/java.htm -
HEY JAVA技術社區http://www.heyjava.com/ -
ACCP教程網http://www.accptech.com/index.html
論壇網站 -
美河論壇http://www.eimhe.com/bbs/ -
魔http://bbs.mldn.cn/ -
http://bbs.chinajavaworld.com/index.jspa
技術網站 -
apache的ANThttp://ant.apache.org/bindownload.cgi -
IBM http://www.ibm.com/developerworks/-
IDE-
Eclipse官網http://www.eclipse.org/downloads-
MyEclipse官網http://www.myeclipseide.com/
軟件測試
軟件測試網http://www.51testing.com/
1 程序員論壇:http://www.gxcxy.com
2 J2me社區 http://www.j2meforums.com/forum/
3 csdn http://www.csdn.net/
4 Vc知識庫 http://www.vckbase.com/
5 codeproject http://www.codeproject.com/
6 程序員聯合開發網 http://www.pudn.com/
7 看雪學院 http://www.pediy.com
8 藍色理想 http://www.blueidea.com/
9 博客園 http://www.cnblogs.com/
10 Nuix應用開發社區 http://chinaunix.net/
11 javaeye http://www.javaeye.com
12 It人網 http://www.iteer.net/
13 中國人才熱線 http://www.cjol.com/
14 天涯論壇 http://www.tianya.cn/
15 風云的blog http://blog.codingnow.com/
16 新浪科技頻道 http://tech.sina.com.cn/
17 phpchina http://www.phpchina.com/html/index.html
18 游戲開發資源網 http://www.gameres.com/
19 網絡游戲第一門戶 http://www.17173.com/
20 我愛研發網 http://www.52rd.com/
21 Msdn中文網 http://www.microsoft.com/china/MSDN/DeveloperCenter/default.mspx
22 大富翁編程網站 http://www.delphibbs.com/
23 Delphi盒子 http://www.2ccc.com/
24 C++buillder研究 http://www.ccrun.com/
25 It論壇 http://bbs.itren.cn/
26 Java開源大全 http://www.open-open.com/
27 codegurn http://www.codeguru.com/
28 編程愛好者 http://www.programfan.com/
29 Java中文站 http://www.java-cn.com/
30 reactos http://www.reactos.org/zh/index.htm
31 開源力量 http://www.opensourceforce.org/
32 電腦編程技巧與維護 http://www.comprg.com.cn/
33 中國電子網 http://21ic.com/
34 編程中國 http://www.bc-cn.net/
35 嵌入式開發論壇 http://www.cevx.com/bbs/
36 電腦愛好者 http://www.cfan.com.cn/
37 sybase中國 http://www.sybase.com.cn/gvswse/site/china/index.jsp
38 pbdr http://www.pbdr.com/
39 apache http://www.apache.org
40 rootkit http://www.rootkit.com/index.php
41 驅動開發網 http://www.driverdevelop.com/first.html
42 安全焦點 http://www.xfocus.net/
43 cnbeta網友媒體與言論平臺 http://www.cnbeta.com/
44 fyter的博客 http://www.fyter.cn/Default.aspx
45 asp.net控件 http://www.devexpress.com/
46 operamask http://www.operamasks.org/
47 中國源碼網 http://www.yuanma.org/
48 sawin軟件研發之窗 http://www.sawin.cn/
49 電腦教育與WEB教育在線 http://210.40.7.188/
50 中國dos聯盟 http://www.cn-dos.net/
51 中國bios聯盟 http://www.biosren.com/index.php
52 bioscentral http://bioscentral.com/
53 eda專業論壇 http://www.edacn.net/bbs/
54 諾基亞論壇 http://forum.nokia.com.cn/sch/index.html
55 計算機科學論壇 http://www.ieee.org.cn/index.asp
56 ibm developerworks 中國 http://www.ibm.com/developerworks/cn/
57 w3 http://www.w3.org/
58 網頁設計師 http://www.w3cn.org/
59 中國萬維網聯盟 http://www.w3china.org/index.htm
60 豆瓣 http://www.douban.com/
61 程序員門戶站:http://www.gxcxy.com
62 軟件商務網 http://www.bizsofts.com/
63 sun http://www.sun.com/
64 google code http://code.google.com/
65 google 開發人員主頁 http://code.google.com/intl/zh-CN/
66 the official microsoft asp.net http://www.asp.net/
67 microsoft IIS http://www.iis.net/default.aspx?tabid=1
68 榮耀 http://www.royaloo.com/index.html
69 侯捷網站 http://jjhou.csdn.net/
70 java大本營 http://www.javadby.com/
71 比特網 http://www.chinabyte.com/
72 51cto http://www.51cto.com/
73 infoq http://www.infoq.com/
74 博客堂 http://blog.joycode.com/
75 嵌入式開發網 http://www.embed.com.cn/
76 嵌入式開線 http://www.mcuol.com/
77 中嵌網 http://www.chinaeda.cn/
78 酷勤網 http://www.kuqin.com/
79 紅聯linux門戶 http://www.linuxdiyf.com/
80 itpub技術門戶 http://www.itpub.net/
81 程式設計俱樂部 http://www.programmer-club.com/index.asp
82 uml軟件工程組織 http://www.uml.org.cn/index.asp
83 delphi園地 http://www.delphifans.com/
84 theserverside http://www.theserverside.com/
85 中國donet俱樂部 http://www.chinaaspx.com/
86 編程王 http://www.kingofcoders.com/
87 it168 http://www.it168.com/
88 open source software in c# http://csharp-source.net/
89 中國IT實驗室 http://www.chinaitlab.com/
90 落伍者站長論壇 http://www.im286.com/
91 中國站長站 http://www.chinaz.com/
92 asp.net源碼下載專業站 http://www.51aspx.com/
93 it職業工程師 http://www.51myit.com/
94 太平洋電腦網 http://www.pconline.com.cn/
95 乘風原創程序 http://study.qqcf.com/
96 網易學院 http://tech.163.com/school/
97 程序設計/程序開發類教程 http://www.pcvz.com/Program/Programs/Index.html
98 算法源碼吧 http://www.sfcode.cn/
99 codegurn http://www.codeguru.cn/
100 得益網 http://www.netyi.net/
101 中國eclipse社區 http://www.eclipseworld.org/bbs/
102 項目管理者聯盟 http://www.mypm.net/
103 棲息谷 http://www.21manager.com/
104 J2me開發網 http://www.j2medev.com/bbs/index.asp
105 卓越亞馬遜 http://www.amazon.cn/
WEB技術:
WEB前端開發 http://www.css88.com/
Ext JS官方網 http://www.extjs.com/
Ext JS中文資料 http://www.extjs.org.cn/
義:不同的地理信息系統或地理信息系統與其他信息系統之間實施數據雙向交換時采用的數據格式
引自百度百科
據百度百科上的描述數據交換這個詞最早是在《地理信息系統名詞》第二版,很明顯不是用來做編程的。在編程方面數據交換格式僅僅是一種格式,當前主流使用的格式有 3 種 : XML、JSON、YAML
既然是一種格式,那么它就需要標準,因為通過標準可以限定各個格式中的具體內容
XML(全稱EXtensible Markup Language),在我看來它是一種古老的數據交換格式,因為從我接觸到編程開始它就已經存在了
標準所在網址:https://www.w3.org/TR/1998/REC-xml-19980210
最新文檔地址:https://www.w3.org/TR/REC-xml/
其實XML的標準一直是1.0,至少我沒有見過其他的,一般情況下我們在編寫XML文檔的時候都需要遵循一個約束文件,這個約束文件中規定了你可以編寫的內容。約束文件存在的方式也有兩種,原來是 DTD 格式現在主流的是 Schema
XML 如果想完整的學習還是比較費勁的,不過一般情況下要求約束文檔能看懂,XML內容會編寫即可
參考網址:https://www.w3school.com.cn/x.asp
Delphi解析可使用 TXMLDocument(Delphi自帶),此外也可以使用微軟的 MSXML2 我沒有這種需求所以并沒有深入研究
官方文檔:http://docwiki.embarcadero.com/Libraries/Sydney/en/Xml
JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。相比于XML格式JSON更為簡單明了
標準文檔地址:http://www.json.org/json-zh.html
具體的語法規則可以參考上面網址的文檔內容,中文的
Delphi官方(當前最新版本DelphiXE10.4.2)已經支持對于JSON的解析了,官方文檔地址
http://docwiki.embarcadero.com/Libraries/Sydney/en/System.JSON
需要注意的是有些類是Tokyo 10.2新增的,在使用的時候需要檢查一下自己的版本
YAML (全稱YAML Ain’t Markup Language),YAML不是標記語言的意思,YAML是便于人閱讀基于unicode 編碼的各種語言的序列號標準。
YAML語言的設計參考了JSON,XML和SDL等語言。YAML 強調以數據為中心,簡潔易讀,編寫簡單
官網地址:http://yaml.org
一個讓人頭皮發麻的站點
學習的話可以參考 阮一峰 老師的博客內容,地址:https://www.ruanyifeng.com/blog/2016/07/yaml.html
沒有找到官方支持,不過在GitHub上有一個開源庫是支持Delphi解析YAML格式數據的,有興趣的朋友可以去研究
地址:https://github.com/neslib/Neslib.Yaml
最后我想說我非常討厭這種數據格式,和python一樣依靠縮進和空格控制語法。。。
將原來視頻中講解的代碼在DelphiXE10.4.2上進行了重構
uses
System.JSON, System.Generics.Collections, System.JSON.Serializers,
System.SysUtils;
type
{ 實體類,主要是用于JSON字符串和類對象的互相轉換 }
TStudent=class(TObject)
private
FName: string;
FAge: Integer;
public
property Name: string read FName write FName;
property Age: Integer read FAge write FAge;
constructor Create; overload;
constructor Create(FName: string; FAge: Integer); overload;
end;
constructor TStudent.Create;
begin
end;
constructor TStudent.Create(FName: string; FAge: Integer);
begin
Self.FName :=FName;
Self.FAge :=FAge;
end;
begin
{ 定義一個JSON字符串 }
var
UserJson :='{"FName":"小黑","FAge":18}';
{ 創建序列化對象 }
var
Serializer :=TJsonSerializer.Create();
{ 反序列化,其實就將字符串轉為對象 }
var
Student :=Serializer.Deserialize<TStudent>(UserJson);
Writeln('反序列化:' + Student.Name + ',' + Student.Age.ToString);
{ 列表轉換,將TLIst容器轉為字符串,也可以說是數組轉換 }
var
List :=TList<TStudent>.Create;
List.Add(TStudent.Create('小白', 30));
List.Add(TStudent.Create('蕭薔', 30));
// 創建序列化對象
Serializer :=TJsonSerializer.Create();
Writeln('序列化:' + Serializer.Serialize < TList < TStudent >> (List));
var
{ 一個比較復雜的json字符串 }
Users :='{"FListHelper":{"FCount":2},"FItems":[{"FName":"小白","FAge":30},{"FName":"蕭薔","FAge":30}],"FComparer":{}}';
// 創建序列化對象
Serializer :=TJsonSerializer.Create();
{ 可以嘗試下這里會不會有問題,當字段匹配時居然可以直接轉換 }
var
UserList :=Serializer.Deserialize < TList < TStudent >> (Users);
for var Stu in UserList do begin
Writeln('反序列化:' + Stu.Name + ',' + Stu.Age.ToString);
end;
{ 獲取指定字段 }
Writeln(TJSONObject.ParseJSONValue(Users).GetValue<TJSONObject>
('FListHelper').GetValue<string>('FCount'));
Writeln(TJSONObject.ParseJSONValue(Users).GetValue<TJSONArray>('FItems')
.Count.ToString);
Readln;
end.
其實Delphi自帶的JSON解析已經夠用了,如果不能滿足你的話有一個開源庫你可以嘗試,不過我看它最近一次更新代碼是 3 年前....
Github地址:https://github.com/hgourvest/superobject
學習資料(萬一老師的博客):https://www.cnblogs.com/del/category/215158.html
*請認真填寫需求信息,我們會在24小時內與您取得聯系。