数组随机拆分字符串
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 可以解决手头的问题。
正在使用逗号作为分隔符拆分字符串。每次打印字符串时,它都会以不同的顺序出现。字符串是可变的: ' 字符串: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 可以解决手头的问题。