5

要素数に関する事前情報がないデータを蓄積している場合は、配列を使用し、必要に応じてを使用して拡大することができますRedim Preserveが、通常はリストの方が効率的です。例えば:

Dim vehicle As New List(Of String)(4)

vehicle.Add("car")
vehicle.Add("bicycle")
vehicle.Add("truck")
vehicle.Add("taxi")
vehicle.Add("motorbike")
vehicle.Add("bus")

要素の最大数としての4の推測は間違っていましたが、問題なく新しい要素を追加できます。

要素を表示できるので、次のようになります。

For inx = 0 To vehicle.Count - 1
    Debug.Print("    " & inx & " " & vehicle(inx))
Next

そして取得:

0 car
1 bicycle
2 truck
3 taxi
4 motorbike
5 bus

必要に応じて要素を更新し、再表示できます。

vehicle(2) = "coach"
vehicle(4) = "cart"

For inx = 0 To vehicle.Count - 1
    Debug.Print("    " & inx & " " & vehicle(inx))
Next

取得するため:

0 car
1 bicycle
2 coach
3 taxi
4 cart
5 bus

構造のリストをほぼ同じくらい簡単に作成できます。

Structure SpersonDtl
    Dim familyName As String
    Dim givenName As String
    Dim age As Integer
End Structure

Dim personDtl As New List(Of SpersonDtl)(4)
Dim personDtlCrnt As SpersonDtl

personDtlCrnt.familyName = "Smith"
personDtlCrnt.givenName = "John"
personDtlCrnt.age = 20
personDtl.Add(personDtlCrnt)

personDtlCrnt.familyName = "Brown"
personDtlCrnt.givenName = "Clare"
personDtlCrnt.age = 21
personDtl.Add(personDtlCrnt)

personDtlCrnt.familyName = "Wilson"
personDtlCrnt.givenName = "David"
personDtlCrnt.age = 22
personDtl.Add(personDtlCrnt)

personDtlCrnt.familyName = "Fox"
personDtlCrnt.givenName = "Wendy"
personDtlCrnt.age = 23
personDtl.Add(personDtlCrnt)

リストの内容を次のように表示します。

For inx = 0 To personDtl.Count - 1
    Debug.Print("    " & inx & " " & personDtl(inx).givenName & " " & _
                personDtl(inx).familyName & " " & personDtl(inx).age)
Next

与える:

0 John Smith 20
1 Clare Brown 21
2 David Wilson 22
3 Wendy Fox 23

personDtlが配列の場合、要素を簡単に更新できます。ウェンディの年齢を修正するために、私は次のように書きます。

personDtl(3).age = 24

ただし、リストを含む同じステートメントでは、下に青い線が表示され、「式は値であるため、割り当てのターゲットにすることはできませんpersonDtl(3).ageというエラーメッセージが表示されます。

私が見つけた最善の解決策は次のとおりです。

Dim personDtlCrnt As SpersonDtl

personDtlCrnt = personDtl(3)
personDtlCrnt.age = 24
personDtl(3) = personDtlCrnt 'Write back.

私のアプリケーションでは、情報を大きくて複雑な構造に蓄積しています。リストから要素をコピーするには、新しい情報項目を1つ追加してから、それをコピーして戻すのは効率的なプロセスではありません。

別のアプローチの提案をいただければ幸いです。

4

1 に答える 1

9

構造体の代わりにクラスを使用してみてください。

クラスと構造の選択から

タイプのインスタンスが小さく、一般的に短命であるか、一般的に他のオブジェクトに埋め込まれている場合は、クラスの代わりに構造を定義することを検討してください。

タイプに次のすべての特性がない限り、構造を定義しないでください。

  • プリミティブ型(integer、doubleなど)と同様に、単一の値を論理的に表します。

  • インスタンスサイズが16バイト未満です。

  • 不変です。

  • 頻繁に箱詰めする必要はありません。

これらの条件の1つ以上が満たされない場合は、構造体の代わりに参照型を作成してください。このガイドラインに従わないと、パフォーマンスに悪影響を与える可能性があります。

SpersonDtlの「構造」を変更可能にするには、値の1つを変更します。これにより、上記の特性の1つが壊れます。

于 2012-07-12T22:47:59.310 に答える