2015-12-04 4 views
0

У меня есть 109,728 значений в моем CSV [381 значений в одной строке & всего 288 строк] Я нахожу минимальное и максимальное значение в своем CSV и на основе его создания диапазонов. Затем сравнивает каждое значение и диапазон поиска, в котором находится значение.Найти диапазон значений Значения Lies

Для примера

  • Минимальное значение - 30
  • Максимальное значение - 31
  • Нет диапазона - 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(); 
+0

Вместо преобразования значения в текстовых полях на 'int' и приращением ее, а затем преобразовывать обратно в строку, чтобы положить обратно в текстовые поля, просто отслеживать все значения в' междунар [ ] 'и обновить текстовые поля в конце. – juharr

ответ

1

В основном вам необходимо уменьшить количество преобразований и синтаксического анализа, которые вы выполняете, и ограничить количество раз, когда вы обращаетесь к элементам пользовательского интерфейса. Вы можете сделать это, отслеживая значения, которые вы хотите увеличить в 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(); 
+0

Время сокращено до 77 мс. Спасибо, что он работает. Изменено изменение textboxArray [j] .Text = textBoxValues ​​[j] .ToString(); должен быть там. –

0

При оптимизации вы посмотрите на строки кода, которые выполняются в самый раз. В своем внутреннем обличье вы пишете текстовое поле 1,09,728 раза. Это то, что замедляет вас. Выньте обновления экрана, удалив ссылку на текстовое поле в

textboxArray[j].Text = (Convert.ToInt32(textboxArray[j].Text) + 1).ToString(); 

Это значительно ускорит вас.

Смежные вопросы