質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

6回答

1290閲覧

プロパティで配列を扱いたい

yuuyu

総合スコア1139

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

1グッド

0クリップ

投稿2019/10/13 06:25

実現したいこと

プロパティのgetの中で少し計算してから値を返したい。
コード的にはこのような形

C#

1private int[] onevalue = { 1, 2, 3, 4, 5}; 2public int[] OneValue{ 3 get{ 4 int ret = onevalue[i] + 5; //iはどうやって取得? 5 return ret; 6 } 7} 8 9public main(){ 10 Debug.Log(OneValue[3]); // ここの3が、上記iに代入されて、9が出力されてほしい。 11}

上記のコードのように、プロパティ内で少し計算したいのですが、
呼び出された時の配列の値を受け取る方法が思いつかなかったので質問しました。

コメント欄にも書いているように、自分が何番目を呼ばれて実行されたのか、それがわかる方法はありますか?

退会済みユーザー👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ozwk

2019/10/13 06:43 編集

プロパティの型がint[]になってますが 配列の要素を返しているので intでいいんですよね?
yuuyu

2019/10/13 06:49

private int[] onevalueがint[]となるので、int[]と記述しましたが、戻り値はint型になりますね。。
len_souko

2019/10/13 21:51

解決済みとなっていますが、質問文にコメントに書いてあると書いてあります。正直どこにあるのか分かりにくく、今後検索してたどり着いた人にはわかりにくいと思いますのでコメントに書いた内容を意図が分かりやすい表現で質問文へ追記できませんか?また、個人的には「//iはどうやって取得?」が混乱のもととなっているように思えますので、「//iはどうやって渡せるのか?」とした方がいいと思います。
guest

回答6

0

  1. 素直にメソッドにする
  2. インデクサにする
  3. インデクサを実装したクラスを返す

投稿2019/10/13 06:54

ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuuyu

2019/10/13 07:01

回答ありがとうございます 他の方の回答も見て、素直にメソッドにすることにしました。。
guest

0

YAmaGNZさんが書かれているように、C#には引数付きプロパティは作成できませんが、
似た機能にインデクサーがあります。
ただVBの機能に比べて使い勝手が悪いので、私もメソッドにした方がいいと思います。

C#

1class TestClass { 2 private int[] onevalue = {1, 2, 3, 4, 5}; 3 public int this(int index) { 4 get { 5 return this.onevalue[index] + 5; 6 } 7 } 8} 9 10class Program { 11 static void Main() { 12 var test = new TestClass(); 13 Debug.WriteLine(test[3]); //9 が出力されます。 14 } 15}

投稿2019/10/13 06:49

draq

総合スコア2573

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuuyu

2019/10/13 07:00

回答ありがとうございます 先ほど自分でも調べてみましたが、classを定義しないといけないみたいですね。。。 今回はメソッドの方を使うことにします
guest

0

ベストアンサー

C#では引数付きのプロパティを作成できません。
ですので、メソッドにしたほうがよろしいかと思います。

C#

1public int GetOneValue(int index) 2{ 3 return onevalue[index] + 5; 4}

投稿2019/10/13 06:45

YAmaGNZ

総合スコア10258

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuuyu

2019/10/13 06:57

回答ありがとうございます。 やはり配列は無理なんですね。。 普通にメソッドで書くことにします
guest

0

インデクサーでどうでしょうか。

インデクサー

投稿2019/10/13 06:50

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuuyu

2019/10/13 07:01

回答ありがとうございます インデクサーですが、実装に少し手間がかかるようだったので、普通にメソッドで返そうと思います。。
guest

0

C#はほとんど使っていませんが、確か「インデクサ」(indexer) と呼ばれるものがあったはずです。
これを実装することで、

C#

1CharaList charaList = new CharaList(); 2Chara chara1 = charaList[1];

みたいに配列ぽくアクセスできた気がします。

参考: ヒント1

投稿2019/10/13 06:48

BeatStar

総合スコア4958

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuuyu

2019/10/13 06:59

回答ありがとうございます。 ヒントも見てみたのですが、classを定義しないといけなくなる感じだったので、返ってややこしくなる気がしました。 なので、また別でインデクサを使うときに参考にしようとおもいます
BeatStar

2019/10/13 07:40

あ、前提が間違っていたんですね。私。 クラスが持つリストや配列を取得したいのだと思っていました... 確かに今回の場合はメソッド化( C言語でいう関数 ) にしたほうがいいかも...
guest

0

単にint型の値のみを返したいのであれば、int型の配列だとエラーを起こすと思います。
変数iが受け取った値だとしたら、このようなコードになると思います。

int i = 3; //受け取った値 private int[] onevalue = { 1, 2, 3, 4, 5 }; public int OneValue { get { int ret = onevalue[i] + 5; return ret; } } public void main() { Debug.Log(OneValue); }

後は、自分が何番目を呼ばれて実行されたのかについてですが、受け取った値が配列の何番目の要素かということでよろしいでしょうか?
そうであれば、IndexOfメソッドが便利かと思います。すでに知っていたらすいません...

int num = Array.IndexOf(配列名,受け取った値); //要素番号の取得

こうすることで、配列の中に受け取った値が何番目にあるかを取得できます。

また、IndexOfメソッドは最初に見つけた要素番号しか返さないため、配列内に重複した値がある場合は、

int num = Array.IndexOf(配列名, 受け取った値); while (0 <= num) { if (num + 1 < 配列名.Length) { foundIndex = Array.IndexOf(配列名,受け取った値, num + 1); } }

のようにして、IndexOfメソッドは値が見つからない場合、-1を返すのを利用してwhile文でループさせて全て取得する方法もあります。

質問の意図と違っていたらすいません...

投稿2019/10/13 07:35

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuuyu

2019/10/13 12:37

回答ありがとうございます。 配列の値の内容と、書き方がややこしかったかもしれないですが、 今回は配列の中にあるかを探すのではなく、配列の何番目の値を取得するか、のような形でした。。 上記で別の書き方をするならこの形になります。 ------------------------------------------------------------------------ private string[] onevalue = { "a", "b", "c", "d", "e"}; public string OneValue{ get{ int ret = onevalue[i] + " return"; //iはどうやって取得? return ret; } } public main(){ Debug.Log(OneValue[3]); // ここの3が、上記iに代入されて、"d return"が出力されてほしい。 } ------------------------------------------------------------------------
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問