C#铸造整个数组?
我看到这个Array.ConvertAll
方法,但它需要一个Converter
作为参数。 我不明白为什么我需要一个转换器,当我已经在我的类中定义了一个隐式转换器时:
public static implicit operator Vec2(PointF p) { return new Vec2(pX, pY); }
我试图将一个PointF
的数组Vec2
到Vec2
的数组中。 有没有一个很好的方法来做到这一点? 或者我应该把它吸了起来,写(另一个)转换器或循环的元素?
使用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));
后者可能更有效,因为结果的大小是事先知道的。