C # конвертирует ArrayList типа ints в Point [] - PullRequest
1 голос
/ 12 августа 2011

Прежде всего, я запускаю это на мобильном устройстве с использованием CE6.5. У меня есть ArrayList данных, которые являются целочисленными, и для целей построения графиков я хочу преобразовать их по порядку, в число, в котором оно находится в списке, и значение int в значения x и y для Point. Поместите все эти точки в массив точек, затем используйте bufferedGraphics.DrawLines, чтобы нарисовать это на форме. У меня есть способ сделать это, который работает довольно быстро, но я не уверен, что это лучший способ. Любые предложения или улучшения этого кода?

Да, список данных обычно составляет около 450 или более, в зависимости от размера экрана и поворота.

public Point[] toPointArray(int w, int h) {
      Point[] p;
      int val;

      p = new Point[dataList.Count];
      for (int i = 0; i < dataList.Count; i++) {
          val = (int)dataList[i];
          if (i < p.Length)
               p[i] = new Point(i, h - (val * h) / range + (min * h) / range);
      }
      return p;
}

Некоторые из моих поступающих данных обновляют список данных со скоростью 256 раз в секунду, поэтому проблемы с перезаписью существуют, но пока это работает даже на этих скоростях.

Вот некоторые значения скорости относительно того, как быстро это происходит, время в секундах:

Time to complete 0.000588
Time to complete 0.0005886154
Time to complete 0.0005846154
Time to complete 0.0005870769
Time to complete 0.0005830769
Time to complete 0.0005806154
Time to complete 0.0005981539
Time to complete 0.0007206154
Time to complete 0.0005836923
Time to complete 0.001039077

После получения предложений из приведенных ниже ответов, вот как выглядит мой код сейчас, и я получаю в среднем 0,00047 секунд времени выполнения. dataList - это глобальный объект, который теперь является списком, а не ArrayList; приведение (int) занимало четверть исходного времени обработки.

   List<int> dataList = new List<int>();

   public Point[] toPointArray(int w, int h) {
        Point[] p = new Point[dataList.Count];
        for (int i = 0; i < dataList.Count; i++) {
            p[i] = new Point(i, h - (dataList[i] * h) / range + (min * h) / range);
        }

        return p;
    }

Ответы [ 2 ]

3 голосов
/ 12 августа 2011

РЕДАКТИРОВАТЬ - после комментария об индексе и словаре:

Point[] p = (from i in Enumerable.Range(0, dataList.Count) 
             select new Point(
                        i, 
                        h - (((int)dataList[i]) * h) / range + (min * h) / range))
            .OrderBy ((pp) => pp.X)
            .ToArray();

это работает с ArrayList и т. Д.

1 голос
/ 12 августа 2011

1) Объявите переменные в том же месте, где вы их используете. Нет необходимости объявлять Point [] отдельно (он создается сразу после этого), и нет причин объявлять int val отдельно (он не используется вне цикла и нет никаких потерь производительности для объявления его там, где вы его используете). 2) Вы знаете, что я

3) Используйте LINQ
4) Используйте предложенные Microsoft стандарты именования (ProperCase для методов)
5) Используйте лучшие имена переменных
6) Используйте лучшие имена методов - этот метод не преобразует его в массив (или, по крайней мере, это не основная цель метода)
7) Используйте типизированное хранилище данных. Мы не можем увидеть, что такое dataList, но вам не нужно преобразовывать его в целое число (если только вы не знаете, что это длинное целое число или что-то в этом роде)

Если вы можете использовать LINQ, я не рассматривал решение Yahia, но оно должно работать. Если вы не можете / не хотите использовать LINQ, попробуйте:

public Point[] ToPointGrid(int width, int height)
{
  Point[] points = new Point[dataList.Count];
  for(int index = 0; index < dataList.Count; ++index)
  {
    points[index] = new Point(index, height - (dataList[index] * height) / range + (minimum * height) / range);
  }
  return points;
}
...