简单介绍一下DataTable。DataTable主要基于表、行、单元格。行用集合包装单元格,表用集合包装行,大致就是这样。DataColumn表示单元格,DataColumn中的字段还挺多的,在实际应用中我们可能只想用它来存一个int型的数据;中用一个ArrayList封装DataColumn,表示一些单元格的集合;DataRow直接在DataColumnCollection的基础上提供一些方法,成为行记录。而DataRowCollection则用集合的方式封装DataRow成为表,但它不是以线性、链表等方式,而是基于红黑树<>,主要是查询和删除比较方便,而DataTable则是DataRowCollection的封装,对看了DataTable整个实现的大致代码,我不得吐槽一下:这它妈是把牛刀,我们每天用它来切菜,用着还挺方便。DataTable提供了很强大的功能,但是我们基本不需要,有时候基本上是得到一个DataTable,啥都不做,直接绑定,最常用的也就Update和Insert,Select和Delete则次之。当然你会说避免使用DataTable,当然还有人说C#......
OK废话到此结束,今天我想做说的是用C++来实现DataTable。大致思路还是按照C#中的来,功能没有C#中的强大,但增删改查的功能还是有的,基本还是个人练习,把代码放出来跟大家讨论一下。基本上是STL中几个集合的运用。在我的实现在并没有使用红黑树,而是用list<DataRow*>代替了,主要类的头文件如下:
DataColumn的实现代码如下,主要是对几个字段的封装。
#pragma onceclass DataTable;#includeusing namespace std; template class TDataColumn{public: TDataColumn():columnName(string()),caption(string()) { } TDataColumn(const string& _columnName):columnName(_columnName),caption(string()) { } virtual ~TDataColumn() { } void Caption(const string& _caption) { caption=_caption; } string Caption() { return caption.size() ?caption:columnName; } void ColumnName(const string& _columnName) { columnName=_columnName; } string ColumnName() { return columnName; } void Value(const T& _value) { value=_value; } T Value() { return value; } int ObjectId() { return objectId; } void Table(DataTable* tb) { table=tb; } DataTable* Table() { return table; } string TypeName() { return typeid(T).name(); } protected: int objectId; string columnName; string caption; T value; DataTable* table;}; class DataColumn:public TDataColumn {public: friend class DataColumnCollection; friend class DataTable; DataColumn():TDataColumn () { objectId=++objectCountId; } DataColumn(const DataColumn& dc) { *this=dc; } DataColumn& operator=(const DataColumn& dc) { objectId=++objectCountId; columnName=dc.columnName; caption=dc.caption; value=dc.value; table=dc.table; return *this; } DataColumn(const string& _columnName):TDataColumn (_columnName) { objectId=++objectCountId; } bool operator==(const DataColumn& dc) { return objectId==dc.objectId; } bool operator!=(const DataColumn& dc) { return objectId!=dc.objectId; } bool operator<(const DataColumn& dc) { return objectId (const DataColumn& dc) { return objectId>dc.objectId; } void Show() { cout<<"columnName:"< <<",caption:"< <<",value:"< <
#pragma once#includeusing namespace std; #include #include #include #include
测试代码如下:
#includeusing namespace std;#include #include "DataColumn.h" #include "DataTable.h"#include "OperationTimer.h" int main( ){ DataTable dt; for(size_t i=0;i<10;i++) { string s("column"); s.push_back(char('0'+i)); DataColumn *dc=new DataColumn(s); dt.Columns().Add(dc); } for(int j=0;j<10;j++) { DataRow* dr=dt.NewRow(); for(int i=0;i<10;i++) { string s("row"); s.push_back(char('0'+j)); s.push_back(char('0'+i)); (*dr)[i].Value(s) ; } dt.Rows().Add(dr); } int rowCount=dt.Rows().Count(); int columnCount=dt.Columns().Count(); cout<<"共"< <<"行"< <<"列"< * vect=dt.Select("column3","row43"); for(size_t i=0;i size();i++) { DataColumnCollection& dcCollect= (*vect)[i]->Columns(); for(size_t j=0;j
结构截图:
在吐个槽,STL中的map<key,value>中的key竟然可以用string呢,好神奇哦,哈哈哈
C/C++程序员在自涅中需找快感;C#/JAVA则全靠意淫。是这样吗?