在值中找到范围

时间:2015-12-04 12:46:01

标签: c#

我的CSV中有109,728个值[381个值在一行&共288行] 我在CSV中找到最小值和最大值,并根据它创建范围。 然后比较每个值和找到值所在的范围。

例如

  • 最低价值 - 30
  • 最大值 - 31
  • No of Range - 3
  • 范围为[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();

2 个答案:

答案 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();

这会显着加快你的速度。