2015-06-23 20 views
0

基於顯示的代碼..我是否在編寫正確的編碼,如果我想比較正在流入的數據?基本上是從部件檢測部分接收數據的重複

while(serialPort1.IsOpen) 

開始例如第一串的接收數據被T12中29.5然後下一個字符串被T12中29.5隨後Ť20 24.5和上,從而基本上..什麼不可預料的要接下來收到。

我想程序中能夠檢測/計數外觀中部value..like的數量...

================= ===
[數量] | [重複次數]

12 | 2

===================但是當接收到另一個不同的號碼,

[數字] | [重複]

20 | 1

===================只要收到不同的號碼,號碼的計數器將被覆蓋並重置。

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) 
    { 

     string time = DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss.ff"); 
     RxString = serialPort1.ReadLine(); 

     string[] split = RxString.Split('.'); 
     string dp = split[1]; 
     Char c = dp[0]; 
     split[1] = c.ToString(); 
     RxString = split[0] + "." + split[1]; 

     while (serialPort1.IsOpen) 
     { 
     string[] number = RxString.Split(' '); 
     string unit = number[1]; 

     int count = 1; 
     for(int i = 1; i < unit.Count(); i++) 
     { 
     if(unit[i-1] == unit[i]) 
      count++; 
     else 
      count = 1; 

     if(count == 4) 
     { 
    //execute some parameters 
     } 
     } 
     } 

     this.Invoke(new EventHandler(DisplayText)); 

     StreamWriter MyStreamWriter = new StreamWriter(@"C:\Users\acer\Documents\Data3.txt", true); 
     MyStreamWriter.Write(time + "  " + RxString + "\r\n"); 
     MyStreamWriter.Flush(); 
     MyStreamWriter.Close(); 
    } 

編輯V2

爲什麼不會只擁有1個計數的前衛記錄數據?

  string[] number = RxString.Split(' '); //split RxString by ' ' 
      string unit = number[1]; //unit = unit no. 
      int count = 1; 

      for (int i = 1; i < unit.Count(); i++) 
      { 
       if (unit[i - 1] == unit[i]) 
        count++; 
       else 
       { 
        count = 1; 
        StreamWriter MyStreamWriter = new StreamWriter(@"C:\Users\acer\Documents\Data3.txt", true); //True tell SW to append to file instead of overwriting 
        MyStreamWriter.Write(time + "  " + RxString + "\r\n"); //Write time + string 
        MyStreamWriter.Flush(); 
        MyStreamWriter.Close(); 
       } 
+0

你期待的行爲是什麼?您是否想要覆蓋號碼並重置計數器,還是希望將新號碼存儲到適當的位置? – PMerlet

+0

@Cubi如果count = 4,我會編輯這4個數據的時間然後記錄到DB中。如果計數!= 4,這些記錄將像往常一樣記錄在數據庫中 – Athena

+0

您的問題對我來說沒有多大意義。看來你已經知道你在做什麼了。你需要什麼幫助?它有助於Sql部分還是什麼? – Fabjan

回答

1

你應該使用字典來存儲每個元素和自己的計數:

var dict = new Dictionary<string, int?>(); 

while (serialPort1.IsOpen) 
{ 
    string[] number = RxString.Split(' '); 
    string unit = number[1]; 

    if (dict.ContainsKey(unit)) 
    { 
     if (dict[unit].HasValue) 
     { 
      dict[unit]++; 
      if (dict[unit] == 4) 
      { 
       // execute some parameters 

       dict[unit] = null; 
      } 
     } 
    } 
    else 
    { 
     dict.Add(unit, 1); 
    } 
} 
+0

對不起,但你能解釋「dict.Add(unit,1)」這行嗎? – Athena

+0

它添加到詞典中一個新的鍵,它是你的單位變量,並將計數初始化爲1 – PMerlet

+0

如果我只想讓count爲臨時變量,該怎麼辦?因爲一旦檢測到4個計數後,它將會「無用」。 – Athena

0

我想創建一個特殊的結構:

struct DataInfo 
{ 
    public string Number { get; set; } 
    public int Counter { get; set; }   
    ... Other data you require to work with 
} 

而且請使用List<DataInfo>Dictionary<string, DataInfo>來存儲值;