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