C#Cast整个数组?

mpe*_*pen 54 c# arrays casting

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

    public static implicit operator Vec2(PointF p)
    {
        return new Vec2(p.X, p.Y);
    }
Run Code Online (Sandbox Code Playgroud)

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

Nol*_*rin 93

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

var newArray = Array.ConvertAll(array, item => (NewType)item);
Run Code Online (Sandbox Code Playgroud)

使用ConvertAll方法
a)数组只迭代一次,
b)操作更优化数组(不使用IEnumerator<T>).

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

  • 没问题.是的,在C#2.0之前你必须定义一个类型 - 幸运的是那些日子已经过去了. (3认同)
  • 嗯,实际上,我相信所提出的解决方案都不会使数组迭代两次,因为 Cast 和 Select 都是使用延迟执行来实现的:https://msdn.microsoft.com/en-us/library/bb341406(v= vs.90).aspx#Anchor_2 https://msdn.microsoft.com/en-us/library/bb548891(v=vs.90).aspx#Anchor_2 (3认同)

小智 32

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

myArray.Cast<Vec2>().ToArray();
Run Code Online (Sandbox Code Playgroud)

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

  • 需要命名空间:使用System.Linq (4认同)

Mar*_*ers 18

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

myArray.Select(p => (Vec2)p).ToArray();
Run Code Online (Sandbox Code Playgroud)

或写一个转换器:

Array.ConvertAll(points, (p => (Vec2)p));
Run Code Online (Sandbox Code Playgroud)

后者可能更有效,因为结果的大小是事先已知的.


fda*_*adf 5

最有效的方法是:

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

A[] a = new A[9];
B[] b = a as B[];
Run Code Online (Sandbox Code Playgroud)