2012-03-09 15 views
2

Array.Copy()メソッドを使用して、いくつかの配列をc#でコピーしようとしています。Array.Copy()を使用した配列内容の自動型変換

OldType(){ 
int param1; 
String param2; 
} 

NewType(OldType old){ 
setParam1(old.param1); 
setParam2(old.param2); 
} 

OldType oldArray[]; 
NewType newArray[]; 

//will this automatically convert??? 
Array.Copy(oldArray, newArray); 

これは、にレガシーオブジェクトから変換する際に使用するためのものです:このメソッドは、そのように私は、コンストラクタを定義した場合には、ユーザー定義型を変換する場合はしかし、私は疑問に思って、自動的に入力し、変換をすることになっています新しいオブジェクト。内容はまったく同じで、名前はまったく異なります。

+1

[ドキュメント](http://msdn.microsoft.com/en-us/library/k4yx47a1.aspx)のどの部分を理解できませんでしたか? –

+2

@ M.Babcock - その長いドキュメントのどの部分を意味していますか? –

+0

@HenkHolterman - もっと徹底できるとは思わない。 –

答えて

0

あなた自身や誰かがあなたのコードを疑問に読んでしまうことなくこの変換を行う簡単な方法があります:LINQを使用してください。ドキュメントhereとして

OldType[] oldArray = /* Some logic */; 
NewType[] newArray = oldArray.Select(old => new NewType(old)).ToArray(); 

(コメントでM.Babcockにより指摘)Array.CopyはO(n)の動作である、と言います。同様に、上記で書いたLINQコードはO(n)演算であるため、漸近的なパフォーマンスヒットはありません(実際のパフォーマンスは複数の要因に依存するため、2つのソリューションの実行時間を比較することはできません)プロファイリングなし)、このコードが正しいことがわかります。 MSDNのドキュメントからも

場合sourceArrayのdestinationArray両方基準型配列であるか、またはObject型の両方のアレイであり、浅いコピーが行われます。配列の浅いコピーは、元の配列と同じ要素への参照を含む新しい配列です。要素自体、または要素によって参照されるものはコピーされません。対照的に、配列のディープコピーは、要素と要素によって直接的または間接的に参照されるすべてをコピーします。

ありませんので、Array.Copyはすなわち、実際にコピー中にタイプNewTypeの新しいオブジェクトを作成するのではなく、単にタイプOldTypeのオブジェクトへの参照をコピーし、newArrayでこれらの参照を入れて「自動的に変換」しません。

+2

"パフォーマンスヒットはありません"。時間の複雑さが同じであるという理由だけで、まったく同じパフォーマンスを持つ必要はありません。 – svick

+0

@svickあなたがコメントをしたとき、私はパフォーマンスの差異のより微妙な記述を含むように答えを修正しました。 –

関連する問題