c#将int类型的数组列表转换为Point[]
本文关键字:转换 Point 列表 数组 int 类型 | 更新日期: 2023-09-27 18:05:24
首先,我在使用CE6.5的移动设备上运行这个。我有一个数组列表,里面的数据都是整型的,为了绘图的目的,我想按顺序把数字转换成列表,把整型的值转换成点的x和y值。将所有这些点放入点数组中,然后使用bufferedGraphics。将其绘制到窗体上。我有一种方法,似乎工作得很快,但不确定这是否是最好的方法。对这段代码有什么建议或改进吗?
哦,是的,dataList通常在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是一个全局变量,现在是List而不是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;
}
编辑-索引和字典注释后:
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)在使用变量的同一位置声明变量。不需要单独声明Point[] a(它是在那之后创建的),也没有理由单独声明int val(它不会在循环之外使用,并且在使用它的地方声明它不会造成性能损失)。
2)你知道这是<p.长度(假设是单线程应用程序),取消检查。>
3)使用LINQ
4)使用Microsoft建议的命名标准(方法的ProperCase)
5)使用更好的变量名
6)使用更好的方法名——这个方法不会将其转换为数组(或者至少,这不是该方法的主要目的)
7)使用类型化数据存储。我们看不出dataList是什么,但你不应该把它转换成int型(除非你知道它是一个长型,或者类似的类型)
如果你可以使用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;
}