.NET PointCollection, созданная с помощью массива, ведет себя иначе, чем созданная из PointCollection.

У меня есть 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 на простой массив точек (Point[]), надеясь, что это немного ускорит доступ. Однако, когда я это делаю, мой многоугольник (мгистограмма) вообще не обновляется.

Это сбивает меня с толку. Я создаю новую коллекцию PointCollection из IEnumerable (mPc), которая должна создать новую коллекцию PointCollection, которая ведет себя так же, как и любая другая коллекция PointCollection. Почему он ведет себя по-другому при создании с помощью массива (точка [])?

Спасибо.


person DiamondBack    schedule 14.07.2011    source источник
comment
Кажется, что Polygon также обновляется, если mPc является коллекцией List‹Point› или другим объектом на основе System.Collections. Очевидно, это как-то связано с простым массивом, хотя я до сих пор не понимаю, что именно.   -  person DiamondBack    schedule 15.07.2011


Ответы (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 элементов.

person CodeNaked    schedule 15.07.2011
comment
CodeNaked, спасибо за отзыв. Я не уверен, что я делал раньше. Скорее всего, это была ошибка инициализации с моей стороны. Тем не менее, вы правы, и я согласен с тем, что Polygon не должен заботиться о том, как построена PointsCollection, и действительно, если все сделано правильно. - person DiamondBack; 18.07.2011