当前位置: 代码迷 >> C# >> list<string> 怎么查询次数
  详细解决方案

list<string> 怎么查询次数

热度:50   发布时间:2016-05-05 04:53:22.0
list<string> 如何查询次数?
做过测试想
   写个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;






------解决思路----------------------
引用:
标签处理部分:


 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;
    }


这段代码惨不忍睹。那么多的 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,匹配。

这样,一直移到最后,所有匹配项都找出来了。

  相关解决方案