数组随机拆分字符串

时间:2015-04-03 23:23:30

标签: c# asp.net arrays windows split

正在使用逗号分隔字符串作为分隔符。每次打印字符串时,它都会以不同的顺序显示。 String是可变的: '字符串:Z1,TA,H999.00,T999.00'  它成功分裂,但即使字符串完全相同,在打印数组时,我们也会得到随机的新行和随机数据。

当打印到文本框时,它正确分割,或者像:       -Z1       -T     -H999.00     -T999。     -00 如果Loop再次运行,我们会得到不同的结果。奇怪的是,它正确显示。

我假设它的代码是:(编辑:不是)

 string[] ArrayCleanDataRX = CleanDataRX.Split(',');
 foreach (string EntireList1 in ArrayCleanDataRX)   
   {
   TxtZ1.AppendText(EntireList1);
TxtZ1.AppendText("\n");
}

任何建议都会很精彩。 谢谢。

更新:(尚未解决) 更新2:更多代码 -

 #region Global Strings
    public string DirtyDataRX;                                                   //String contains Data from Serial
    public string Z1 = "Z1";                                                     //String to check if Data from serial Contains Z1
private void FeedbackProcessing(object sender, EventArgs e)
    {
        TxtDirtyDataRX.AppendText(DirtyDataRX);                                    //Populate TxtDirtyTest with DirtyText String   


        var CleanDataRX = DirtyDataRX;                                             //Clean Data = Dirty Text
        var charstoremove = new string[] { "|", "-", "%", " ", "  ", "   ", "~", "$", "?", "'", ".,", "..,", "..", "..:", ".:", "...", "....", ".....", "......", "......", "......", "-" };  // Contents of CharsToRemove (Removes Bad Charecters from raw serial) 
        foreach (var c in charstoremove)                                           //C is Char(s) to remove
        {
            CleanDataRX = CleanDataRX.Replace(c, string.Empty);                    //Replace C in CleanDataRX with nothing.            
        }

        TxtCleanDataRX.AppendText(CleanDataRX);                                    //Show DirtyDataRX in DirtyDataRX Textbox  

        #region IfZones and Array Loops
        if (CleanDataRX.Contains(Z1))                                                 // If CleanDataRX Contains "Z1" Run Code
        {
            string[] ArrayZ1 = CleanDataRX.Split(',');                           //New String Array from CleanDaraRX. Split using Comma as Delimiter  

            foreach (string StrArrayZ1 in ArrayZ1)                               // New string Called StrArrayZ1 in ArrayCleanDataRX 
            {
                TxtZ1.AppendText(StrArrayZ1);                                      //Append Textbox with String Array, Loop untill Empty

            }
        }

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

        DirtyDataRX = serialPort1.ReadExisting();
        this.Invoke(new EventHandler(FeedbackProcessing));
    }
    #endregion

我觉得代码是错误的,因为这个问题被排除在外以简化问题。 注意:某些阵列名称已被略微编辑..

3 个答案:

答案 0 :(得分:0)

这种代码的和平不足以回答这个问题。但是,如果您使用多线程,则必须使用锁以避免危险结果。

示例:

lock(TxtZ1)
{ 
  string[] ArrayCleanDataRX = CleanDataRX.Split(','); 
  foreach (string EntireList1 in ArrayCleanDataRX1)   
  {

             TxtZ1.AppendText(EntireList1);
             TxtZ1.AppendText("\n");
  }
}

答案 1 :(得分:0)

TxtZ1是一个文本框?

然后你应该做类似的事情:

string[] ArrayCleanDataRX = CleanDataRX.Split(',');
StringBuilder sb = new StringBuilder(); 
foreach (string EntireList1 in ArrayCleanDataRX)   
{
    sb.AppendLine(EntireList1);
}

TxtZ1.AppendText(sb.ToString());

我认为如果你使用Environment.Newline而不是\ n,它也会解决它。 Windows控件中的\ n往往会发生奇怪的事情......

答案 2 :(得分:0)

感谢您的帮助。问题在我自己解决了...... 这不完全是循环,或分裂...对不起。 这可能有助于其他人...... 由于正在积极构建字符串,因此抛出了错误。问题在于如何在串口读取方法中读取数据,这就是它:

 DirtyDataRX = serialPort1.ReadExisting();
 this.Invoke(new EventHandler(FeedbackProcessing));

由于传入的数据是面向行的。应该使用ReadLine ....

        DirtyDataRX = serialPort1.ReadLine();
        this.Invoke(new EventHandler(FeedbackProcessing)); 

使用ReadLine解决了手头的问题。