全部转换
为了明确起见,这里是您使用 ConvertAll 的方法。
如果class B 有一个名为class A 的成员m_a,请执行以下操作:
B[] arrB;
A[] arrA = Array.ConvertAll(arrB, b => b.m_a);
.
如果class B有一些成员数据需要在返回A类型的对象之前进行操作(比如将一堆数值转换成字符串描述),这样做:
class B
{
public static A makeAfromB(B b)
{
// Do something with B data...
A a = new A("data made from B data")
return a;
}
// rest of class B implementation ...
}
// somewhere else in your code...
A[] arrA = Array.ConvertAll(arrB, new Converter<B, A>(B.makeAfromB));
.
您还可以使用 Lambda 函数:
A[] arrA = Array.ConvertAll(arrB, new Converter<B, A>(
delegate(B b)
{
// Do something with B data, though object b is const
A a = new A("data made from B data")
return a;
}));
.
如果 ConvertAll 可以使用隐式运算符进行转换,那就太好了,但我还没有弄清楚如何做到这一点。
.
演员表
@Randolpho @瓶颈
对于您只是想迭代并且不想制作副本的情况,使用 cast 是有意义的。但是我一直无法让它工作。
我有一个InkPoint 类,它有一个Point 对象和一些其他成员。我想调用DrawLines(Pen, Point[]) 函数。但是,我有一个 InkPoint[] 数组。
这是我的课程和我目前必须使用的代码,它制作了一个副本:
public class InkPoint
{
public InkPoint(int x, int y)
{
point = new Point(x, y);
}
public Point point { get; set; }
public static implicit operator Point(InkPoint p)
{
return p.point;
}
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
InkPoint[] inkPoints = { new InkPoint(1,2), new InkPoint(3,4) };
Point[] points = Array.ConvertAll(inkPoints, x => x.point);
Pen pen = new Pen(Color.Black, 1);
e.Graphics.DrawLines(pen, points);
}
.
我宁愿调用它,但它不会编译,引用无效参数:
e.Graphics.DrawLines(pen, inkPoints.Cast<Point>()); // Compile err: invalid args
.
我也尝试过迭代一个演员表,但它抛出了一个异常,理由是演员表无效
foreach (Point p in inkPoints.Cast<Point>()) { } // Exception: cast not valid
.
我不明白为什么specified cast is not valid 因为我定义了一个隐式运算符。我可以做到以下几点:
InkPoint ip = new InkPoint(10, 20);
Point p1 = ip; // implicit conversion
Point p2 = (Point)ip; // cast
.
对我来说,情况实际上比这要复杂一些。我实际上有一个 InkPoint 列表,List<InkPoint>,但DrawLines 函数只接受数组。所以我的代码如下所示:
List<InkPoint> inkPoints = new List<InkPoint>();
inkPoints.Add(new InkPoint(5, 10));
inkPoints.Add(new InkPoint(10, 15));
Point[] points = inkPoints.ConvertAll<Point>(x => x.point).ToArray();
我可以稍微重新安排一下:
Point[] points = Array.ConvertAll(inkPoints.ToArray(), x => x.point);
.
所以我认为这里实际上发生了两个副本。这很烦人,因为我想做的就是画线。 DrawLines 函数应该能够迭代包含对可以隐式转换为 Point 对象的对象的引用的数组/列表,这似乎不是不合理的。