数组随机拆分字符串

Array Randomly Splitting String

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

当打印到文本框时,它要么正确拆分,要么类似: -Z1 -T -H999.00 -T999。 -00 如果循环再次运行,我们会得到不同的结果。在奇怪的情况下,它会正确显示。

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

 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

省略了我认为与问题无关的代码以简化问题。 注:部分数组名称略有改动..

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

示例:

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

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

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 往往会发生奇怪的事情...

感谢您的帮助。问题自己解决了... 这不完全是循环,也不是分裂……抱歉。 这可能会帮助其他人...... 抛出错误是因为正在主动构建字符串。问题出在串口读取方法中是如何读取数据的,是这样的:

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

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

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

改用 ReadLine 可以解决手头的问题。