ページ 1 / 1
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);
}
}
というコードがあります。
これがそのままサンプルとして使えるのではないでしょうか。