数据结构多种多样,而且每一种都有其使用的场合。应该了解最基本的数据结构,比如队列,栈,链表,图等,也可以利用结构体封装数据,利用枚举变量限定某些值,而不仅仅是使用数组。下面说下我的理解:
1、用结构体封装数据
有两个场合比较适合使用结构体。
第一:对特定的模块进行操作时可以使用结构体封装其所有需要的数据元素。
比如:关于PLC的所有操作可以封装为一个结构体,如下所示:
/// <summary>
/// 封装PLC操作时的相关参数
/// </summary>
public struct PLC
{
public bool connectIsOk = false;//检查PLC与上位机通信是否正常
public string address;//PLC的地址
public string readPlc = "";//读PLC的命令使用的地址
public string setPlc = "";//设定PLC的命令使用的地址
...
}
第二:数据采集过程中使用。
比如:实验进行过程中,需要采集温度,压力,风速等值,可以将这些数据封装在一个结构体中进行处理,如下所示:
/// <summary>
/// 封装数据采集过程中需要处理的相关参数
/// </summary>
public struct collectData
{
public double thermotubeTemp;//热管温度
public double windSpeed;//风速
public double channelPressure;//管道中的压强
}
当然,也可以采用类似JavaBean的做法,将相关数据封装在一个类中,并提供访问器。这种做法也很好,但是,容易出现的情况就是,有些人会将所有需要处理的数据都封装在一个类中,命名为Param。这样子处理其实是很容易造成混乱的。
2、用链表或队列进行求平均值
在数据的实际采集过程中,可能由于环境因素或设备的原因,使得采集的数据中存在轻微的波动,这时,需要加一个求平均值的过程,使得数据更有可信度。
使用ArrayList求平均值的核心代码如下:
//第一步:定义存储10个采集的风速值,进行求平均值
ArrayList windSpeedList = new ArrayList(10);
//第二步:每次循环采集数据的时候,用最新采集的数据替换最早采集的数据
windSpeedList.RemoveAt(0);//将最前面的一个数据拿掉,后面的数据将依次前移
windSpeedList.Add(10.1);//将最新采集的时间添加在末尾
//第三步:进行求平均值计算
double windSpeedAverage = 0;
foreach(double temp in windSpeedList)
{
windSpeedAverage += temp;
}
windSpeedAverage = windSpeedAverage / windSpeedList.Count;
使用Queen求平均值的核心代码如下:
//第一步:定义一个队列,用来存储数据
Queue windSpeedQueen = new Queue();
//第二步:每次循环采集数据的时候,进行数据的替换
windSpeedQueen.Enqueue(10.1);//最新采集的数据入队
windSpeedQueen.Dequeue();//删除对头的元素
//第三步:求平均值
double windSpeedAverage = 0;
foreach(double temp in windSpeedQueen)
{
windSpeedAverage += temp;
}
windSpeedAverage = windSpeedAverage / windSpeedQueen.Count;
3、用HashTable进行快速的数据查找操作
在进行编程的时候,由其是网络编程过程中,为了提高数据的传输速度,通用的一种做法就是给每一台机器、每一个操作人员等配一个唯一标识符,即ID。本地显示的时候,显示操作人员的姓名,但进行相关操作的时候,传递的数据是ID,这样可以有效的提高传输速度。在客户端,需要建立一个名字与ID对应的表,这样,在知道ID的情况下,可以很方便的得到操作员的姓名等信息。这时,采用HashTable是最高效的做法。
下面把HashTable的常用方法列举如下:
//新建一个hashtable,并往其中添加两条数据
Hashtable operatorTable = new Hashtable();
operatorTable.Add(1, "wang");
operatorTable.Add(2, "zhang");
//1、知道key的值,取key对应的value
string name=(string)operatorTable[2];
//2、知道value的值,利用循环找到其对应的key值
foreach(int key in operatorTable.Keys)
{
if(key==1)
{
Console.WriteLine(operatorTable[key]);
break;
}
}
//3、循环取出value的值
foreach(string value in operatorTable.Values)
{
if(value=="zhang")
{
Console.WriteLine(value);
}
}
未完待续。。。