使用数组构造的.NET PointCollection的行为与从PointCollection构造的行为不同

时间:2011-07-14 23:55:28

标签: .net arrays polygon shape

我有一个System.Windows.Controls.Canvas,我以编程方式放置一个System.Windows.Shapes.Polygon:

private Canvas mMainCanvas = new Canvas();
private Polygon mHistogram = new Polygon();

稍后,我使用大量事件更新多边形(约1,000,000左右)。我一直试图尽可能快速有效地实现这一目标(自我斗争)。我最近的尝试是将值累积到PointCollection中并定期重新设置Polygon的集合(mHistogram):

int i = 10000;
PointCollection mPc = new PointCollection(256);
double y;
Point p;

private void EventProcessor( int bin ) {
    if (0 < i--) {
        p = mPc[bin];
        y = p.Y + 1;
        p.X = p.X;
        p.Y = y;
        mPc[bin] = p;
        if (mMainCanvas.Height < p.Y)
            mMainCanvas.Height = p.Y;
    }
    else {
        i = 10000;
        mHistogram.Points = new PointCollection( mPc ); /* This works if mPc
                                                           is a PointCollection.
                                                           It does not work if 
                                                           mPc is a Point[]
    }
}

这似乎工作正常,尽管还不够快。所以,我将mPc的类型从PointCollection更改为一个简单的Points(Point [])数组,希望这会使访问速度更快一些。但是,当我这样做时,我的Polygon(mHistogram)根本无法更新。

这令我感到困惑。我从IEnumerable(mPc)创建一个新的PointCollection,它应该创建一个新的PointCollection,其行为就像任何其他PointCollection一样。使用数组(Point [])创建时,为什么它的行为会有所不同?

感谢。

1 个答案:

答案 0 :(得分:1)

您描述的问题似乎不太可能,并且可能与您的代码的另一个问题有关。查看这个简单的测试,您可以验证是否实际创建了相同的集合:

PointCollection collection1 = new PointCollection(new Point[] { new Point(1, 1), new Point(2, 2) });
PointCollection collection2 = new PointCollection(collection1);
for (int i = 0; i < collection2.Count; i++) {
    if (collection1[i] != collection2[i])
        throw new InvalidOperationException();
}

对于Points属性的赋值,Polygon不关心PointsCollection的创建方式。

这两段代码都会产生相同的结果:

poly.Points = new PointCollection(new Point[] {
    new Point(100, 100),
    new Point(200, 200)
});

var coll = new PointCollection();
coll.Add(new Point(100, 100));
coll.Add(new Point(200, 200));
poly.Points = new PointCollection(coll);

请注意以下内容有所不同:

var collection = new PointCollection(256);
var array = new Point[256];

该集合包含0个项目,但有空间可容纳256个预先分配的项目。该数组包含256个项目,并且只能容纳256个项目。