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表达式,如上所示.
小智 32
作为这个旧问题的更新,您现在可以:
myArray.Cast<Vec2>().ToArray();
Run Code Online (Sandbox Code Playgroud)
其中myArray包含源对象,Vec2是您要转换为的类型.
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)
后者可能更有效,因为结果的大小是事先已知的.
最有效的方法是:
class A { };
class B : A { };
A[] a = new A[9];
B[] b = a as B[];
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
56770 次 |
| 最近记录: |