博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++山寨C#中的DataTable
阅读量:6673 次
发布时间:2019-06-25

本文共 6634 字,大约阅读时间需要 22 分钟。

简单介绍一下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;#include 
using 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#include 
using namespace std; #include
#include
#include
#include
#include "DataColumn.h" #include "StringHelper.h"class DataColumnCollection;class DataRow;class DataRowCollection;class DataTable;class DataColumnCollection{public: friend class DataTable; friend class DataRow; friend class DataRowCollection; DataColumnCollection(DataTable* table); ~DataColumnCollection(); void Add(DataColumn* dc); void Add(DataColumn* dc,size_t index); DataColumn& Add(const string& columnName); bool Contains(const string& columnName); void Clear(); size_t Count(); int IndexOf(const string& columnName); void Remove(DataColumn& dc); void Remove(const string& columnName); void RemoveAt(size_t index); void CopyTo(DataColumnCollection* arr, size_t index); DataColumn& operator[](size_t index); DataColumn& operator[](const string& columnName); void Table(DataTable* tb); DataTable* Table();private: void Add(DataColumn* dc,size_t index,DataColumnCollection* collect); void RemoveAt(size_t index,DataColumnCollection* collect); void InitData(); DataColumnCollection(); vector
dlist; map
nameList; DataTable* table;};class DataRow{public: friend class DataTable; friend class DataRowCollection; friend class DataColumnCollection; ~DataRow(); void Table(DataTable* tb); DataTable* Table(); DataColumnCollection& Columns(); DataColumn& operator[](size_t index); DataColumn& operator[](const string& columnName); bool operator=(const DataRow& dr);private: DataRow(); void Remove(DataColumn& dc); void RemoveAt(size_t index); DataColumnCollection* columns; DataTable* table; int rowId; static volatile int rowIdCount;};class DataRowCollection{public: friend class DataTable; friend class DataColumnCollection; DataRowCollection(DataTable* table); ~DataRowCollection(); void Add(DataRow* dc); void Clear(); size_t Count(); void Remove(DataRow* dc); void RemoveAt(size_t index); DataRow& operator[](size_t index); void Table(DataTable* tb); DataTable* Table();private: DataRowCollection(); list
drlist; DataTable* table;};class DataTable{public: friend class DataColumnCollection; friend class DataRowCollection; DataTable(); DataTable(const string& _tableName); ~DataTable(); DataColumnCollection& Columns(); DataRowCollection& Rows(); string TableName(); void TableName(const string& _tableName); DataRow& operator[](size_t index); void Clear(); DataRow* NewRow(); vector
* Select(const string& columnName,const string& value) ;private: void InitData(); DataColumnCollection* dcCollect; DataRowCollection* drCollect; string tableName;};

测试代码如下:

#include 
using 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则全靠意淫。是这样吗?

转载地址:http://bdgxo.baihongyu.com/

你可能感兴趣的文章
iOS开发网络篇—NSURLConnection基本使用
查看>>
angularjs笔记(二)
查看>>
SQL Server数据库多种方式查找重复记录
查看>>
Target runtime Apache Tomcat v6.0 is not defined.错误解决方法
查看>>
为什么我们要研究中断?【转】
查看>>
tcpdump wireshark 实用过滤表达式(针对ip、协议、端口、长度和内容) 实例介绍...
查看>>
C#.net调用axis2webService
查看>>
NOIP2010乌龟棋[DP 多维状态]
查看>>
Linux 系统中用户切换(su user与 su - user 的区别)
查看>>
微信订阅号消息回复测试
查看>>
数据库 Proc编程二
查看>>
zabbix-agent 自动注册
查看>>
基于3D Vision眼镜的OSG立体显示 【转】
查看>>
java.lang.AbstractStringBuilder.enlargeBuffer
查看>>
HTML5新增与结构有关的元素
查看>>
C# 复制和克隆认识浅谈
查看>>
Python和Flask真强大:不能错过的15篇技术热文(转载)
查看>>
【LeetCode】Swap Nodes in Pairs 链表指针的应用
查看>>
Swift,Objective-C语言性能对照測试
查看>>
[Node] Using dotenv to config env variables
查看>>