Объект ArrayList для массива объектов Point - PullRequest
0 голосов
/ 07 октября 2010

У меня есть собственный класс CurvePoint, который я определяю набор элементов данных для рисования на экране, используя DrawCurve

Я написал процедуру приведения для преобразования CurvePoint в Point, но я получаю ошибку Как минимум один элемент в исходном массиве не может быть приведен к типу целевого массива. , когда я пытаюсь использовать метод .ToArray в Arraylist

Я могу хорошо разыграть объекты, используя код:

Point f = new CurvePoint(.5F, .5F, new Rectangle(0, 0, 10, 10));

но если происходит сбой при использовании

Point[] Plots=(Point[])_Data.ToArray(typeof(Point));

(где _Data - ArrayList, который заполнен 5 объектами CurvePoint)

Вот полный код:

public partial class Chart : UserControl
{
    ArrayList _Data;
    public Chart()
    {
        InitializeComponent();
        _Data = new ArrayList();
        _Data.Add(new CurvePoint(0f, 0f,this.ClientRectangle));
        _Data.Add(new CurvePoint(1f, 1f, this.ClientRectangle));
        _Data.Add(new CurvePoint(.25f, .75f, this.ClientRectangle));
        _Data.Add(new CurvePoint(.75f, .25f, this.ClientRectangle));
        _Data.Add(new CurvePoint(.5f, .6f, this.ClientRectangle));
    }
    private void Chart_Paint(object sender, PaintEventArgs e)
    {
        _Data.Sort();
        e.Graphics.FillEllipse(new SolidBrush(Color.Red),this.ClientRectangle);
        Point[] Plots=(Point[])_Data.ToArray(typeof(Point));
        e.Graphics.DrawCurve(new Pen(new SolidBrush(Color.Black)), Plots);
    }
}
public class CurvePoint : IComparable
{
    public float PlotX;
    public float PlotY;
    public Rectangle BoundingBox;
   public CurvePoint(float x, float y,Rectangle rect)
    {
        PlotX = x; PlotY = y;
        BoundingBox = rect;
    }

    public int CompareTo(object obj)
    {
        if (obj is CurvePoint)
        {
            CurvePoint cp = (CurvePoint)obj;
            return PlotX.CompareTo(cp.PlotX);
        }
        else
        { throw new ArgumentException("Object is not a CurvePoint."); }
    }
    public static implicit operator Point(CurvePoint x)
    {
        return new Point((int)(x.PlotX * x.BoundingBox.Width), (int)(x.PlotY * x.BoundingBox.Height));
    }
   public static implicit operator string(CurvePoint  x)
    {
        return x.ToString();
    }
   public override string ToString()
    {
        return "X=" + PlotX.ToString("0.0%") + " Y" + PlotY.ToString("0.0%");
    }

}

Может кто-нибудь подсказать, как исправить код?

Ответы [ 2 ]

2 голосов
/ 07 октября 2010

Во-первых, я бы изменил ваш ArrayList на строго типизированный общий список, List<CurvePoint>. Затем, чтобы получить массив Point, вы можете выполнить этот код.

Point[] Plots = _Data.Select(obj => (Point)obj).ToArray();

Если вы оставите его как ArrayList, вы все равно можете сделать это, используя этот код:

Point[] Plots = (from CurvePoint obj in _Data select (Point)obj).ToArray();
// or
Point[] Plots = _Data.Cast<CurvePoint>().Select(obj => (Point)obj).ToArray();

Edit: Наконец, если вы застряли с ArrayList и , у вас нет LINQ, вы можете сделать это "длинным" способом.

Point[] Plots = new Point[_Data.Count];
for (int i = 0; i < _Data.Count; i++)
{
    Plots[i] = (Point)(CurvePoint)_Data[i];
}
1 голос
/ 07 октября 2010

Причина, по которой вы не можете этого сделать, заключается в том, что ваш ArrayList содержит точки через ссылки на объект.Поэтому пользовательского преобразования объекта из объекта (даже если это ссылка на CurvePoint, в котором определено приведение) не существует, для вашего типа Point.

Следующее исправление поможет (.NET 3.5+):

        Point[] Plots = _Data
            .OfType<CurvePoint>()
            .Select(cp => (Point)cp)
            .ToArray();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...