C#Cast整个数组?

时间:2010-01-14 22:47:59

标签: c# arrays casting

我看到了这个Array.ConvertAll方法,但它需要Converter作为参数。当我已经在我的课程中定义了一个隐含的转换器时,我不明白为什么我需要转换器:

    public static implicit operator Vec2(PointF p)
    {
        return new Vec2(p.X, p.Y);
    }

我正在尝试将PointF s数组转换为Vec2 s数组。有一个很好的方法来做到这一点?或者我应该把它吸干并写入(另一个)转换器或循环元素?

4 个答案:

答案 0 :(得分:88)

使用Cast /'Select'建议的LINQ解决方案很好,但是因为你知道你在这里使用数组,所以使用ConvertAll更有效率,同样简单。

var newArray = Array.ConvertAll(array, item => (NewType)item);

使用ConvertAll表示
a)数组只迭代一次,
b)对阵列进行了更优化的操作(不使用IEnumerator<T>)。

不要让Converter<TInput, TOutput>类型混淆你 - 它只是一个简单的委托,因此你可以为它传递一个lambda表达式,如上所示。

答案 1 :(得分:29)

作为对这个旧问题的更新,您现在可以:

myArray.Cast<Vec2>().ToArray();

其中myArray包含源对象,而Vec2是您要转换为的类型。

答案 2 :(得分:17)

Cast不考虑用户定义的隐式转换,因此您无法像这样强制转换数组。您可以改用select:

myArray.Select(p => (Vec2)p).ToArray();

或者写一个转换器:

Array.ConvertAll(points, (p => (Vec2)p));

后者可能更有效,因为预先知道结果的大小。

答案 3 :(得分:0)

最有效的方法是:

class A { };
class B : A { };

A[] a = new A[9];
B[] b = a as B[];