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

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

ただいまの
回答率

87.34%

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

解決済

回答 6

投稿

  • 評価
  • クリップ 0
  • VIEW 553

score 1099

実現したいこと

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

private int[] onevalue = { 1, 2, 3, 4, 5};
public int[] OneValue{
    get{
        int ret = onevalue[i] + 5; //iはどうやって取得?
        return ret;
    }
}

public main(){
    Debug.Log(OneValue[3]); // ここの3が、上記iに代入されて、9が出力されてほしい。
}

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • ozwk

    2019/10/13 15:42 編集

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

    キャンセル

  • yuuyu

    2019/10/13 15:49

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

    キャンセル

  • len_souko

    2019/10/14 06:51

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

    キャンセル

回答 6

checkベストアンサー

+3

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

public int GetOneValue(int index)
{
    return onevalue[index] + 5;
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/13 15:57

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

    キャンセル

+3

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

class TestClass {
    private int[] onevalue = {1, 2, 3, 4, 5};
    public int this(int index) {
        get {
            return this.onevalue[index] + 5;
        }
    }
}

class Program {
    static void Main() {
        var test = new TestClass();
        Debug.WriteLine(test[3]); //9 が出力されます。
    }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/13 16:00

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

    キャンセル

+3

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/13 16:01

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

    キャンセル

+2

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

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

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

参考: ヒント1

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/13 15:59

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

    キャンセル

  • 2019/10/13 16:40

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

    キャンセル

+2

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

インデクサー

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/13 16:01

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

    キャンセル

+1

単に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 21: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"が出力されてほしい。
    }
    ------------------------------------------------------------------------

    キャンセル

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

  • ただいまの回答率 87.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る