ページ 11

VBからC#への移行について

Posted: 2017年4月19日(水) 15:48
by らいよん
C#初心者で困っています。

VBのソース
Dim ShapeIDs As Object = Nothing
Dim ShapeID As Integer

   処理A

For i = 0 To UBound(ShapeIDs)
ShapeID = ShapeIDs(i)
Next i

上記のようなソースがありこれをC#に移行したいのですが、UBound をC#ではどうしていいかわからず困っています。調べるとC#では変数名.Conunt、変数名.Lengthで取得できそうなのですが変数がObject型なのでShapeIDs.Conunt、ShapeIDs.Lengthはいずれもエラーとなってしまします。
何か良い方法がありましたらご教示願います。

※ShapeIDs 変数は処理Aで関数が呼ばれていてその関数でObject型配列が設定されています。

以上、宜しくお願い申し上げます。

Re: VBからC#への移行について

Posted: 2017年4月19日(水) 16:02
by YuO
変換の前に,Visual Basic側で
・UBound等のMicrosoft.VisualBasicの関数を使わないように変更する
・Option Strict Onにする
などをして,C#に変換しやすいようにした方がよいかと思います。

ShapeIdsが本来Objectの配列であるならば,ShapeIdsの型をObject()に変更して,VBでもLengthを使うようにした方がよいでしょう。

Re: VBからC#への移行について

Posted: 2017年4月19日(水) 18:37
by sleep
一応、Array.GetUpperBoundというのがありますが・・・
らいよん さんが書きました: For i = 0 To UBound(ShapeIDs)
ShapeIDs が配列であることは確定なのですか? (配列ではない場合、UBoundでエラーが出てるとは思いますが・・・)

処理Aが何をしているのか分かりませんが
とりあえず、型が確定しているなら ShapeIDs を Object型にする必要はないと思います。

Re: VBからC#への移行について

Posted: 2017年4月20日(木) 14:33
by らいよん
YuO 様
VBは参考しているソースで私が作成したものではないのです。
C#で同じ処理ができないものかと質問させて頂きました。
C#で代替え処理を考えてみます。返信ありがとうございました。

sleep 様
処理Aで関数を使用しているのですがその関数の引数が Object型なのでをObject型をやめる事はできません。
C#で代替え処理を考えてみます。返信ありがとうございました。

Re: VBからC#への移行について

Posted: 2017年4月20日(木) 15:37
by YuO
"Dim ShapeIds As Object"でググると,このトピックの他に,Mapコントロールの追加example [Chapter 2] | OpenなGISのことというサイトのみがヒットしました。
もし,このサイトを参考にしているのであれば,利用しているライブラリの公式サイトThe MapWindow ProjectからDocumentation - API Documentation - Shapefile - SelectShapesと辿れば,Examplesという項目があります。
そして,例えばSelectBox.csを選択すると,

コード:

                if (sf.SelectShapes(ext, 0.0, SelectMode.INTERSECTION, ref result))
                {
                    int[] shapes = result as int[];
                    if (shapes == null) return;
                    for (int i = 0; i < shapes.Length; i++)
                    {
                        sf.set_ShapeSelected(shapes[i], true);
                    }
                }
というコードがあります。
これがそのままサンプルとして使えるのではないでしょうか。