このArray.ConvertAll
メソッドが表示されますが、引数としてConverter
が必要です。クラスで暗黙的なコンバーターを既に定義しているのに、なぜコンバーターが必要なのかわかりません。
public static implicit operator Vec2(PointF p)
{
return new Vec2(p.X, p.Y);
}
PointF
sの配列をVec2
sの配列にキャストしようとしています。これを行う良い方法はありますか?それとも、それを吸い込んで(別の)コンバータを書くか、要素をループする必要がありますか?
Cast
/'Select'を使用して提案されたLINQソリューションは問題ありませんが、ここで配列を操作していることがわかっているので、ConvertAll
を使用する方が効率的で簡単です。
var newArray = Array.ConvertAll(array, item => (NewType)item);
ConvertAll
を使用すると、
a)配列は1回だけ反復されます。
b)操作は配列に対してより最適化されています(IEnumerator<T>
を使用しないでください)。
Converter<TInput, TOutput>
型で混乱させないでください-これは単なるデリゲートであり、上記のようにラムダ式を渡すことができます。
この古い質問の更新として、次のことができるようになりました。
myArray.Cast<Vec2>().ToArray();
myArrayにはソースオブジェクトが含まれ、Vec2はキャスト先のタイプです。
キャストはユーザー定義の暗黙的な変換を考慮しないため、そのような配列をキャストすることはできません。代わりにselectを使用できます:
myArray.Select(p => (Vec2)p).ToArray();
または、コンバーターを作成します。
Array.ConvertAll(points, (p => (Vec2)p));
後者は、結果のサイズが事前にわかっているため、おそらくより効率的です。