我的CSV中有109,728个值[381个值在一行&共288行] 我在CSV中找到最小值和最大值,并根据它创建范围。 然后比较每个值和找到值所在的范围。
例如
[30 - 31,31 - 32,32 - 33]
如果第一个值为30.5
,那么它将位于第一个范围内,因此该范围的计数值将增加1
。我有它的返回循环,整个过程需要7秒,这根据我的要求太慢。
请帮助我如何减少这段时间。我想在1秒内完成整个过程。
以下是我的代码:
var reader = new StreamReader(File.Open("C:\\Users\\Admin\\Documents\\Imager Data" + "\\" + oldest.Name, FileMode.Open, FileAccess.Read, FileShare.ReadWrite));
while (!reader.EndOfStream)
{
var line = reader.ReadLine();
var values1 = line.Split(';');
for (int i = 0; i < 381; i++)
{
for (int j = 0; j < Convert.ToInt32(textBox5.Text); j++)
{
if (lowerlimit[j] <= double.Parse(values1[i]) && double.Parse(values1[i]) <= upperlimit[j])
{
textboxArray[j].Text = (Convert.ToInt32(textboxArray[j].Text) + 1).ToString();
break;
}
}
}
}
reader.ReadToEnd();
reader.Dispose();
答案 0 :(得分:1)
基本上,您需要减少转换和解析的数量,并限制访问UI元素的次数。您可以通过跟踪要在List<int>
中增加的值并更新结尾处的文本框来实现此目的。
var reader = new StreamReader(File.Open("C:\\Users\\Admin\\Documents\\Imager Data" + "\\" + oldest.Name, FileMode.Open, FileAccess.Read, FileShare.ReadWrite));
while (!reader.EndOfStream)
{
var line = reader.ReadLine();
var values1 = line.Split(';');
int textBoxCount = Convert.ToInt32(textBox5.Text);
List<int> textBoxValues = textboxArray
.Take(textBoxCount)
.Select(t => Convert.ToInt32(t.Text)).ToList();
for (int i = 0; i < 381; i++)
{
for (int j = 0; j < textBoxCount; j++)
{
double numberValue = double.Parse(values1[i]);
if (lowerlimit[j] <= numberValue && numberValue <= upperlimit[j])
{
textBoxValues[j]++;
break;
}
}
}
for (int j = 0; j < textBoxCount; j++)
{
textboxArray[j] = textBoxValues[j].ToString();
}
}
reader.ReadToEnd();
reader.Dispose();
答案 1 :(得分:0)
优化时,请查看执行次数最多的代码行。在你的内心看来,你正在写一个文本框1,09,728次。这就是让你失望的原因。删除对
中文本框的引用,取出屏幕更新textboxArray[j].Text = (Convert.ToInt32(textboxArray[j].Text) + 1).ToString();
这会显着加快你的速度。