全て、
VB.Netに変換したい約100のカスタムコレクションクラスを持つVB6プロジェクトがあります。典型的な例は次のようになります。
Class CAccounts
Private m_Accounts As New Collection
Public Sub Add(newItem As CAccount)
m_Accounts.Add newItem, newItem.IdKey
End Sub
Public Sub Remove(index As Variant)
m_Accounts.Remove index
End Sub
Public Function Item(index As Variant) As CAccount
Set Item = Nothing
On Error Resume Next
Set Item = m_Accounts.Item(index)
End Function
.........
保存されているアイテムはどこにありますか
Class CAccount
Public Id as long
Public Code as String
Public Name as string
Public Sub Init(ByVal Id as Long)
Me.Id = Id
Code = ""
Name = ""
End Sub
Public Property Get IdKey() as String
IdKey = Code
End Property
......
プロジェクト内のすべてのコレクションクラスは、この標準的なアプローチを使用します。ただし、コレクションクラスのすべてのプロパティ/メソッドが実際に使用されるわけではありません。コレクションのほとんどは、「foreach」ループで使用されます。文字列キーを使用したキーアクセスは非常に一般的です。インデックスによるキーアクセスはあまり一般的ではありません。
理想的には、これらのクラスを変換するための標準的なアプローチを採用したいと思います。各コレクションを確認する必要はなく、リストや辞書などが必要かどうかを検討するために使用します。これらのコレクションには100,000個のオブジェクトが含まれるものもあれば、10個しか含まれないものもあります。より単純なオプションで実行できる、より複雑な構造を使用してパフォーマンスの問題を引き起こしたくない。
最善のアプローチについてアドバイスをいただければ幸いです。私は次のことを考えました。
古いスタイルのコレクションにこだわる。したがって、VB.Netに変換するのは比較的簡単ですが、私はむしろより近代的な構造に移行したいと思います。
CAccountsにKeyedCollection(Of String、CAccount)を継承させます。幸い、コレクションに保持されているほとんどのクラスには、クラスの一部としてキーがあります(たとえば、上記のCAccount.IdKey)。これはうまくいくようです。ただし、数値インデックスによるコレクションにアクセスするクラスは比較的少数です。それで、文字列キーによるキー付きアクセスのみが必要な場合、これはおそらくやり過ぎですか?
数値インデックスによるアクセスを必要としないクラスのCAccountsInheritDictionary(Of String、CAccount)を用意します。これに関して私が抱えている問題は、既存の「foreach」ループがすべて「アカウント内のアカウントごと」のようになっていることです。これらすべての発生を「accounts.Valuesのアカウントごとに」のようなものに変更する必要はありません。おそらく、デフォルトのプロパティを変更することでこれを回避できますか?
CAccountsにMyCollection(Of String、CAccount)を継承させます。ここで、MyCollectionは私自身のオーダーメイドのコレクションです。これは少し大変な作業のようです。
私はオプション2に行く傾向があります-すべてをKeyedCollectionにします。次に、必要に応じて例外を作成します(たとえば、一意でないキー)。ただし、KeyedCollectionsがDictionariesよりもはるかに遅い場合は、Dictionaryを標準として使用し、数値インデックスによるアクセスが必要な場合はKeyedCollectionを使用します。
すべてのアドバイスに感謝します。