変奏現実

パソコンやMMORPGのことなどを思いつくまま・・・記載されている会社名・製品名・システム名などは、各社の商標、または登録商標です。

この画面は、簡易表示です

VB.net

[VB.net] for eachにindexが欲しい

大方の場合

For Each item in collection
  debug.print(item .xxx)
Next

で済むけど、何番目なのか知りたい時があるが、

Dim index As Integer=0
For Each item in collection
  debug.print($"{index}:{item .xxx}")   ' あ、indexを+1しないといけない
  index += 1  ’改造中に消えたり、ココを通らなくなるとメンドィ
Next

パッと見、ゴチャったコードになってしまう。

Enumerable.Select メソッドでcollectiomの各要素をindex付のテンポラリィなクラスに差替えられるので、
for each の in で使ってみると・・・

For Each entry In collection.Select(Function(item, index) New With {item, index})
    Debug.Print($"{entry.index}:{entry.item.xxx}")
Next

entryは collectionの要素であるitemとindexのプロパティを持ち、entry.indexには、0から始まる整数が、entry.itemにはcollectionの各要素が入る。

また、EnumerableにはSelectのほかにもDistinct、Where、OrderByやUnionまであるから、SQL風に書こうとすればできないこともないかもしれない。



[VB.net]Enumとハッシュ

VB.net の列挙名と列挙値のリストをハッシュ化する必要があったので調べた。

まずは列挙の名前の方。

Dim aNames= [Enum].GetString(GetType(Enum型名))
Debug.Print(String.Join(",", aNames))

次は列挙の値の方。

Dim aValues= [Enum].GetValues(GetType(Enum型名))
Debug.Print(String.Join(",", aValues))

得た列挙名と値のリストを合体させる

'VBでハッシュテーブルを作る
Function createHash(aNamess() As String, aValues() As Integer)
    Dim ht As Hashtable = New Hashtable
      For Each item In aNamess.Select(Function(Value, Index) New With {Value, Index})
        Dim key As String = item.Value ' コレクションの要素
        Dim index As Integer = item.Index ' ループのインデックス
        Dim val As Integer = aValues(index)
        ht.Add(key, Val)
    Next
    Return ht
End Function

なお、ソース内で使用するenumの列挙子の情報(enumの型名、列挙子の名前、列挙値)を得ることはできるが、参照元でgetEnumValInfo(EnumFuga.Hero)の様に
Enumの列挙子を指定しないうまくいかない。

Public Function getEnumValInfo(enumItem As Object) As String()
    Dim enumType = enumItem.GetType()
    Dim enumItemName = [Enum].GetName(enumType, enumItem)
    Return {enumType.Name, enumItemName, enumItem}
End Function
Public Enum EnumRcIndex
    TypeName
    ItemName
    ItemValue
End Enum

あとは変換先のEnumのハッシュを作り、 変換元のEnum列挙子の情報を得て、先のハッシュに読ませれば・・・

Dim strCollectionB() As String = [Enum].GetNames(GetType(EnumB))
Dim intCollectionB() As Integer = [Enum].GetValues(GetType(EnumB))
Dim aRc1 = getEnumValInfo(EnumA.Hero)
Dim rc = enumHtB(aRc1(EnumRcIndex.ItemName))

トあるEnumAのHeroから別のEnumBのHero値を得られるハズ。

あと列挙型のデータ型は、Integer以外にもStringも指定できるから抽象型(T)で書かないといけないのかもしれない。

それにしても、うーむ、気が付かないうちに、Pythonにでも侵されていたのかな。全然VBコードじゃない。てか、ここまでくると、サンプルの多いC#の方が読みやすいだろうw(普通に

ここまで来るとVBを使う用途は

使い古したVBソースは二度と書き変えたくない。
~ Slanirish Warlander 「変装現実」より~

以外にありえないだろう。(爆笑

参考

列挙型(Enum)に文字列や数値を利用する

[VB.NET] Enum の要素数を知る

列挙体のメンバの値や名前を列挙する

foreachループで現在の繰り返し回数を使うには?

ハッシュテーブル(連想配列)を使うには?



VB6のプロジェクトをVB.Netにする方法

今頃になってVB6で作ったプログラムをVB.Netにしようとしている。
色々ツールはあることはあるが・・・
どれも、VBのフォームのコントロールに日本語名を使っただけで、まったく役に立たないことがよく判った。
と云う訳で、
1.XP-MODEでいいから、VisualVasic(Ver6)の日本語環境を用意する。
OCXを使っているならそれもインストして、コンパイルができるところまで開発環境を復元する。
できれば、VB6のビルダに使っているOCXの依存ファイルの設定なんかもしておいた方がいい。
2.VisualBasic2008 Expressをダウンロードする。
※いつ無くなっても不思議ではないので今すぐDL。
3.1.の環境にVB2008Expressもインストする。
4.VisualBasic2008 ExpressでVB6のプロジェクトファイルを開く。
※VB6をインスト済みの環境にVB2008をインストしないとアップデートウイザードは呼び出されない。
5.後はアップデートウイザードの示すまま、ボタンを押して暫く待つだけ。
以上で、プロジェクトのアップデートは終了。
しかし、ソースのかなりの量がコメントや中途半端な変換になっているので、ビルドするとエラーがいっぱい。
以後は手作業と勘で書き換えていく。
無論、コンバートなんて無理なOCXはコンバートする前に外すしかない。
 
 
 
 




top