合計 昨日 今日

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

フォーラムルール
フォーラムルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Name: らいよん
[URL]
ぴよぴよ(873 ポイント)
Date: 2017年4月19日(水) 15:48
No: 1
(OFFLINE)

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

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型配列が設定されています。

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

Name: YuO
[URL]
ハッカー(152,858 ポイント)
Date: 2017年4月19日(水) 16:02
No: 2
(OFFLINE)

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

変換の前に,Visual Basic側で
・UBound等のMicrosoft.VisualBasicの関数を使わないように変更する
・Option Strict Onにする
などをして,C#に変換しやすいようにした方がよいかと思います。

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

Name: sleep
[URL]
Date: 2017年4月19日(水) 18:37
No: 3
(OFFLINE)

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

一応、Array.GetUpperBoundというのがありますが・・・

らいよん さんが書きました: For i = 0 To UBound(ShapeIDs)

ShapeIDs が配列であることは確定なのですか? (配列ではない場合、UBoundでエラーが出てるとは思いますが・・・)

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

Name: らいよん
[URL]
ぴよぴよ(873 ポイント)
Date: 2017年4月20日(木) 14:33
No: 4
(OFFLINE)

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

YuO 様
VBは参考しているソースで私が作成したものではないのです。
C#で同じ処理ができないものかと質問させて頂きました。
C#で代替え処理を考えてみます。返信ありがとうございました。

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

Name: YuO
[URL]
ハッカー(152,858 ポイント)
Date: 2017年4月20日(木) 15:37
No: 5
(OFFLINE)

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

"Dim ShapeIds As Object"でググると,このトピックの他に,Mapコントロールの追加example [Chapter 2] | OpenなGISのことというサイトのみがヒットしました。
もし,このサイトを参考にしているのであれば,利用しているライブラリの公式サイトThe MapWindow ProjectからDocumentation - API Documentation - Shapefile - SelectShapesと辿れば,Examplesという項目があります。
そして,例えばSelectBox.csを選択すると,
コード[C#]: 全て選択
1
2
3
4
5
6
7
8
9
                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);
                    }
                }
というコードがあります。
これがそのままサンプルとして使えるのではないでしょうか。


Return to C言語何でも質問掲示板

オンラインデータ

このフォーラムを閲覧中のユーザー: Dixq (管理人), 梅衣堂ひよ & ゲスト[11人]