У меня есть базовый класс DtaRow, который имеет внутренний массив строк, содержащих данные. У меня есть десятки подклассов DtaRow, таких как UnitRow и AccountRow, но единственная цель - предоставить свойства для получения значений, поэтому вы можете сделать aUnit.Name
вместо aUnit.pFields(3)
.Понимание Array.ConvertAll, могу ли я DirectCast?
У меня также есть объект DtaTable, который содержит Friend pRows As New Dictionary(Of Integer, DtaRow)
. Обычно я не вставляю DtaRows в DtaTable, я вставляю подклассы, такие как UnitRows и AccountRows. Любая таблица имеет только один тип.
Над в основной части приложения у меня есть аксессор:
Public Readonly Property Units() As IEnumerable
Get
Return Tables(5).pRows.Values 'oh oh oh oh table 5, table 5...
End Get
End Property
Это, очевидно, возвращает список DtaRows, не UnitRows, что означает, что я не могу сделать MyDB.Units(5).Name
, что является конечной Цель.
Очевидное решение - Dim ret As New UnitRow()
и DirectCast все в это, но тогда я постоянно строю тысячи новых массивов. Uggg. В качестве альтернативы я могу повесить DirectCast везде, где я вытаскиваю значение, а также uggg.
Я вижу, что есть метод Array.ConvertAll, который выглядит так, как будто это может быть то, что я хочу. Но, может быть, это просто делает цикл для меня и ничего не спасает? И если это то, что я хочу, я действительно не понимаю, как использовать DirectCast в нем.
Надеюсь, я просто пропустил какой-то другой бит API, который делает то, что я хочу, но в противном случае, какое лучшее решение здесь? Я подозреваю, что мне нужно ...
- сделать расширение конверсии в каждом подклассе DtaRow?
- или что-то в DtaTable, что делает то же самое?
Другое решение? Кажется, что настоящая проблема заключается в том, что я объявил контейнер контейнером (Словарь (Integer, DtaRow)). Это должно быть ** не ** сказать DtaRow? Он должен сказать, правильно? –