C#铸造整个数组?

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

  public static implicit operator Vec2(PointF p) { return new Vec2(pX, pY); } 

我试图将一个PointF的数组Vec2Vec2的数组中。 有没有一个很好的方法来做到这一点? 或者我应该把它吸了起来,写(另一个)转换器或循环的元素?

使用Cast /'Select'build议的LINQ解决scheme是好的,但是既然你知道你正在使用一个数组,那么使用ConvertAll就相当有效,而且简单。

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

使用ConvertAll意味着a)数组只是迭代一次,而不是两次,b)操作对数组进行了更多的优化(不使用IEnumerator<T> )。

不要让Converter<TInput, TOutput>types混淆你 – 它只是一个简单的委托,因此你可以为它传递一个lambdaexpression式,如上所示。

作为对这个老问题的更新,你现在可以做到:

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

其中myArray包含源对象,并且Vec2是要投射到的types。

Cast不考虑用户定义的隐式转换,因此不能像这样转换数组。 你可以用select来代替:

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

或者写一个转换器:

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

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