C#整阵施放?

C#整阵施放?,c#,arrays,casting,C#,Arrays,Casting,我看到了这个Array.ConvertAll方法,但它需要一个Converter作为参数。我不明白为什么我需要一个转换器,因为我已经在我的类中定义了一个隐式转换器: public static implicit operator Vec2(PointF p) { return new Vec2(p.X, p.Y); } 我试图将PointFs的数组转换为Vec2s的数组。有什么好办法吗?或者,我应该把它吸进并写(另一个)转换器或循环在元素上吗?< /P>

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

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

我试图将
PointF
s的数组转换为
Vec2
s的数组。有什么好办法吗?或者,我应该把它吸进并写(另一个)转换器或循环在元素上吗?< /P> < P> CAST不考虑用户定义的隐式转换,所以不能像这样抛出数组。您可以改为使用select:

myArray.Select(p => (Vec2)p).ToArray();
或编写转换器:

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

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

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

var newArray=Array.ConvertAll(Array,item=>(NewType)item);
使用
ConvertAll
意味着
a) 数组只迭代一次,
b) 该操作针对阵列进行了更优化(不使用
IEnumerator


不要让
转换器
类型迷惑您-它只是一个简单的委托,因此您可以为它传递lambda表达式,如上所示。

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

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

其中myArray包含源对象,Vec2是您要强制转换到的类型。

最有效的方法是:

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

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

很好用!非常感谢。我想我必须定义
。没问题。是的,在C#2.0中,在你必须定义一个类型之前-幸运的是那些日子已经过去了。嗯,事实上,我相信所有建议的解决方案都不会使数组重复两次,因为Cast和Select都是使用延迟执行实现的:@Terry:我问了很多琐碎的问题,因为我总是对答案感到惊讶:)解决问题很容易,但很难做到优雅。重复:需要名称空间:使用System.Linq