做过测试想
写个DEMO测试设备读卡性能,在设备识别范围内卡的个数不确定,于是写个配置文件
识别到的每一张卡号,先与配置文件比较,如果在配置文件内包含该卡号,则在界面显示出来,反过来说,即便识别到卡号,若配置文件内,不包含该卡号,则在节目不显示。
配置文件如下:
<tagslist>
<tags value="172543">
</tags>
<tags value="172519">
</tags>
<tags value="172611">
</tags>
<tags value="172638">
</tags>
<tags value="172639">
</tags>
</tagslist>
声明一个变量;
List<string> WaitAddTags = new List<string>();
声明一个函数:
运行就读取配置文件,并把配置文件内的每个标签都添加到 “WaitAddTags”里面
public void getWillShowTagsList()
{
XmlDocument doc = new XmlDocument();
doc.Load("tags.xml"); //加载Xml文件
XmlElement rootElem = doc.DocumentElement; //获取根节点
XmlNodeList personNodes = rootElem.GetElementsByTagName("tags"); //获取tags子节点集合
foreach (XmlNode node in personNodes)
{
string strName = ((XmlElement)node).GetAttribute("value"); //获取标签value属性值
WaitAddTags.Add(strName);
// MessageBox.Show(strName);
}
}
标签处理部分:
for (int i = 0; i < labelCount; i++)
{
//卡号(前三个字节)
labelId = ((data[j]) * 65536 + Convert.ToInt32(data[j + 1].ToString()) * 256 + Convert.ToInt32(data[j + 2].ToString())).ToString();
////状态(显示为二进制数,第四个字节)
idStatus = GetString(Convert.ToString(data[j + 3], 2), 8).Substring(0, 8); //取左边的8位,并转换为2进制
////激活ID(第5和第6个字节)
activateID = (Convert.ToInt32(data[j + 4].ToString()) * 256 + Convert.ToInt32(data[j + 5].ToString())).ToString();
////RSSI值(第七个字节)
rssi = Convert.ToInt32(data[j + 6].ToString()).ToString();
WaitAddTags.ForEach(delegate(String name)
{
// MessageBox.Show(name);
if (name == labelId)
{
showEPCToListView2(labelId, deviceID, idStatus, activateID, rssi);
}
});
j += labelByte;
}
目前这样做呢,效果是实现了,但是太效率太低,如果能减少查询次数?
主要下面这段太耗时了
首先,在一个循环内,解析卡号,
如果一个数据包,包含10个标签,则需要循环10次,才能把每个卡号都解析出来。
其次,
如果:WaitAddTags里包含10个预设的表情,则解析一个卡号就是10次查询,10张卡就是100次查询了
还有,
如果设备识别出来的卡是100张,,这100张卡,都要与配置文件比较,1张卡需要与配置文件比较10次。
这时,如果要把100张看都显示出来,则先在配置文件增加100个预设标签,这样显示识别出来的100张标签,则要查询10000次了
如果,数据包1秒送100个标签,,DEMO的计算量太大了》。。。。
WaitAddTags.ForEach(delegate(String name)
{
// MessageBox.Show(name);
if (name == labelId)
{
showEPCToListView2(labelId, deviceID, idStatus, activateID, rssi);
}
});
j += labelByte;
------解决思路----------------------
这段代码惨不忍睹。那么多的 ToString 是干嘛的?为什么要 ToListView?弄个 j 循环又是干嘛的?
------解决思路----------------------
提供你一个算法,不用做这么多次的对比。
一边是数据包的List, 一边是WaitAddTags的List。
1.首先将连个list排序。
比如左边的顺序是 A,C,D,E,F, 右边的顺序是 B, C,F,G
2.左右先第一个对比。左边A和右边B不匹配,因为A<B,所以左边下移一位。
现在是左边C 右边B。 这次比较,右边下移
现在是左边C右边C,匹配。
这样,一直移到最后,所有匹配项都找出来了。