web-dev-qa-db-ja.com

C#配列全体をキャストしますか?

このArray.ConvertAllメソッドが表示されますが、引数としてConverterが必要です。クラスで暗黙的なコンバーターを既に定義しているのに、なぜコンバーターが必要なのかわかりません。

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

PointFsの配列をVec2sの配列にキャストしようとしています。これを行う良い方法はありますか?それとも、それを吸い込んで(別の)コンバータを書くか、要素をループする必要がありますか?

53
mpen

Cast/'Select'を使用して提案されたLINQソリューションは問題ありませんが、ここで配列を操作していることがわかっているので、ConvertAllを使用する方が効率的で簡単です。

var newArray = Array.ConvertAll(array, item => (NewType)item);

ConvertAllを使用すると、
a)配列は1回だけ反復されます。
b)操作は配列に対してより最適化されています(IEnumerator<T>を使用しないでください)。

Converter<TInput, TOutput>型で混乱させないでください-これは単なるデリゲートであり、上記のようにラムダ式を渡すことができます。

91
Noldorin

この古い質問の更新として、次のことができるようになりました。

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

myArrayにはソースオブジェクトが含まれ、Vec2はキャスト先のタイプです。

31
Ravi

キャストはユーザー定義の暗黙的な変換を考慮しないため、そのような配列をキャストすることはできません。代わりにselectを使用できます:

myArray.Select(p => (Vec2)p).ToArray();

または、コンバーターを作成します。

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

後者は、結果のサイズが事前にわかっているため、おそらくより効率的です。

18
Mark Byers