3

私が作業しているコード ベースには、いくつかの場所に次のようなコードがあります。

Dim i As Integer
Dim ints As New ArrayList
ints.Add(1)

'... lets say we add more Integers

For each i in ints.ToArray(GetType(Integer))
'Do something
Next

.ToArray(GetType(Integer))それを省略しても、実行時にほぼ同じ結果が得られるため、 からどのような利点が得られるのか疑問に思っています。それは を呼んでFor Each i In intsいます。私が見る唯一の違いは、Integer 以外の型が結果のエラー メッセージにある場合は、 .ToArray()ArrayListを呼び出さない方が役立つということです。

型が既に指定されているループを実行する場合、なぜToArray(type)onを使用したいのでしょうか?ArrayListFor Each

4

5 に答える 5

5

型が既に指定されている For Each ループを実行する場合、ArrayList で ToArray(type) を使用する必要があるのはなぜですか?

一般に、これを行いたくない可能性があります。呼び出すと、ToArray()実際に値の新しい配列が作成されます。

これが有益な 1 つの場所は、ループでArrayList. ほとんどのコレクションは列挙中に変更できないため、例外が発生します。呼び出しを追加するToArrayと、コレクションのコピーが (配列として) 列挙されるため、元のコレクションを変更できます。

ToList()一般に、その場合は を使用し、 を使用しないことに注意してください。これは、ToArray()通常はもう少し効率的であるためです (多くの場合、メモリ割り当てが 1 つ少なくなります)。また、型の安全性が得られるため、新しいコードList(Of Integer)の代わりに使用することをお勧めします。ArrayList

于 2013-05-16T17:46:54.140 に答える
2

ループ内で an を呼び出す必要はありません:はToArray既にとして宣言されているため、型変換は自動的に実行されます。ArrayListFor eachiInteger

データをメモリにコピーするために、クエリの結果に対して配列を呼び出す必要がある場合があります。利点が得られる 1 つの場所は、データベース クエリの結果をメモリにコピーすることです。接続をより早く閉じることができるからです。さらにToList、クエリが変更された変数を参照する場合や、IEnumerable複数回生成するとコストがかかる場合に、呼び出しが役立つ場合があります。

于 2013-05-16T17:48:34.980 に答える
1

.ToArray()その ArrayList を呼び出す理由は 2 つあります。

  1. したがって、ArrayList 内のアイテムをキャストする必要はありません。配列は厳密に型指定されているため、それらを最初に配置することは、配列リスト内のすべてが整数であることをコンパイラが認識していることを意味します。
  2. したがって、引数として配列を期待するメソッドに arraylist を渡すことができます。
于 2013-05-16T17:53:28.570 に答える
1

古いコード ベースでの防御的プログラミング。おそらく、当時は「List(Of Integer)」が利用可能ではありませんでした。ループの後半ではなく、"For Each" ステートメント ("ints" に非整数が含まれている場合) で失敗する理由がいくつかあります。

  1. 明らかに、あなたは時間を無駄にしたくありません。ループ内の操作には時間がかかる場合があります。反復 99999 で失敗するよりも、ループを開始する前に失敗する方が良いです。
  2. ArrayList 全体に対して「すべてまたはまったく」操作を実行したい場合があります。
于 2013-05-16T18:23:46.583 に答える