使用多线程将文本框中每行的最后一个字符替换为第一个字符



我有3个文本框和两个按钮,第一个文本框是指定每行中的(n(行和字符数,第一个按钮将在第二个文本框内随机生成(n(个行,第二个按钮将读取第二个文本框中的行,然后将每行的最后一个字符替换为第一个字符。我的问题是,我需要知道如何使用多线程(取决于Environment.ProcessorCount(执行此过程到目前为止,这是我的代码:

public partial class Form1 : Form
{

static int processorCount = Environment.ProcessorCount;
Thread[] arrThr = new Thread[processorCount];
static char[][] array;

public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
int size = Convert.ToUInt16(textBox1.Text);
textBox2.Text = null;
textBox3.Text = null;
Random random = new Random(Convert.ToInt16(DateTime.Now.Second));
array = new char[size][];
for (int i = 0; i < array.Length; i++)
{
array[i] = new char[size];
for (int j = 0; j < array[i].Length; j++)
{
array[i][j] = (char)random.Next(33, 122);
textBox2.Text += Convert.ToString(array[i][j]);
}
textBox2.Text += "rn";
}        
}
private void button3_Click(object sender, EventArgs e)
{
var lines = new List<string>(textBox2.Lines);
for (int i = 0; i < lines.Count - 1; i++)
{
lines[i] = lines[i].Replace(lines[i].ToCharArray().Last(), lines[i].ToCharArray().First());
}
textBox3.Lines = lines.ToArray();
}
}

首先,我认为您发布的代码没有按预期工作,因为Replace方法会将一个字符的所有实例替换为另一个(而不仅仅是最后一个(,所以如果字符串中有其他字符匹配最后一个,那么它们也会被替换。

为了解决这个问题,可以编写如下代码:

for (int i = 0; i < lines.Count - 1; i++)
{
lines[i] = lines[i].Substring(0, lines[i].Length - 1) + lines[i].First();
}

为了并行运行这些代码,.NET框架有一个可以利用的parallel.For循环:

Parallel.For(0, lines.Count - 1, i =>
{
lines[i] = lines[i].Substring(0, lines[i].Length - 1) + lines[i].First();
});

最新更新