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

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

ただいまの
回答率

91.02%

  • C#

    5759questions

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

  • WPF

    605questions

    Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

【C#】木構造の変数群の実現方法

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 180

pandastar

score 1

やりたいこと

C#の勉強としてWPFアプリを作っています。
以下のような木構造の変数群(という表現でいいか謎)をクラスで宣言しようとしているのですが、

生徒(class)
|__名前(string型)
|__成績(class)
   |__国語(int型)
   |__算数(int型)


生徒 Taro = new 生徒();
もしくは
生徒.成績 Taro = new 生徒.成績();
として「名前」もしくは「国語」「算数」を扱うところまでしか分かりませんでした。

インスタンス名を変えて上の2行をどちらも記述しても結局それらが関連付いてないので違うと思いました。

この変数群をシンプルに宣言、インスタンス生成する方法を教えていただきたいです。
(イメージとしては、1つのインスタンス生成で「名前」「国語」「算数」を扱える)
よろしくお願いします。

調べたこと

クラスの入れ子:本質問のような複数階層に変数が存在する例がなかった(そういうものじゃないから?)
クラスの継承:変数の並列追加はできるが本質問内容はできないという理解

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

0

成績クラスを生徒クラスのメンバーにすれば良いです。
たとえば以下のような感じ

class 成績{   // (1)
    public int 国語{ get; set; }
    public int 算数{ get; set; }
}

class 生徒{   // (2)
     private string 名前{ get; set;}
     public 成績 成績{ private set; get; }

     public 生徒(string name){   // (3)
          this.名前 = name;
          this.成績 = new 成績();
     }
}


ポイント
(1) 成績クラスを宣言
(2) 生徒クラスを宣言
(3) コンストラクタで必要なものを初期化

以下のようにつかう。

var taro = new 生徒("たろう");
taro.成績.国語 = 78;
taro.成績.算数 = 88;

var hanako = new 生徒("はなこ");
hanako.成績.国語 = 78;
hanako.成績.算数 = 88;

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/12/10 14:36

    _hiroさん、gazette2さん、回答ありがとうございます。
    お二方のやり方でそれぞれ実装してみて、それぞれやりたいことが実現できることを理解しました。

    今回は質問通り、クラスをメンバにする_hiroさんの方法をBAにさせていただきましたが、Dictionaryでのやり方も状況に応じて使ってみようと思います。
    (絶対にクラスじゃないとダメってことはなく、単にクラスしか今の自分に思いつかなかっただけですね。)

    ありがとうございました。

    キャンセル

0

_hiroさんの答えが正解だとは思いますが、もっと根本的な疑問があります。
そもそも成績の部分がクラスになる必要はあるのでしょうか?
innerクラスよりDictionaryを使用したらいかがでしょうか。

    public class Student
    {
        public string 名前 { get; set; }
        public Dictionary<string, int> 成績 { get; set; }
                 = new Dictionary<string, int>();
    }

    // 生成方法
    Student tanaka = new Student
    {
        名前 = "MyName",
        成績 = { { "国語", 100 }, { "算数", 10 } }
    };

    // 使用方法

    Console.WriteLine(tanaka.成績["国語"]);
    Console.WriteLine(tanaka.成績["算数"]);

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

  • 解決済

    別クラスの変数 配列型のクラス変数を使うには

    下記クラスの変数 width heightを同一パッケージ 別クラスで使用したいです。 Blockクラスの変数をMainActivityで使いたいです。 配列型にした場合、その

  • 解決済

    Binding XTextBoxText.TextBoxTextをBinding XTextBoxT...

    Binding XTextBoxText.TextBoxTextをBinding XTextBoxTextだけにしたいです。 継続の質問なのでコードで。 <Window x

  • 解決済

    Swift クラス定義

    プログラミングに関してはほとんど無知識で、今年からC言語を大学で習い始めて、つい最近swiftの勉強を始めました。しかし、クラス定義がなんなのか、定義する利点はなんなのかいまいちよ

  • 解決済

    抽象クラスのコピー方法(java)

    前提・実現したいこと Javaで抽象クラスの変数を格納した新たなインスタンスをコピーして返却する方法を模索しています。 イメージは以下のような形です。 abstract 

  • 受付中

    |(パイプ)以下の文字を削除したい

    taro|abc ichiro takashi|123 上記のように|(パイプ)が入っている文字の|より前の文字列だけを抜き出したいのですが、 javascript で

  • 受付中

    toStringメソッドのオーバーライドについて

    javaの参考書などをみているとtoStringメソッドをオーバーライドして使っているのがあるのですが、これは何の意味があるのでしょうか? toStringメソッドは ①O

  • 解決済

    Java map使い方、書き方

    数値、 文字列 日付を持ったクラスを 数値をキーにmapでこのクラスのデータを 保持するには どうすれば実現できますか。 簡単な質問で失礼します。

  • 解決済

    【C#】stringの中のstringに値を持たせたい。

    タイトルが分かりにくくてすみません。 例えば田中家と鈴木家の家族の身長を書きたいとき、具体的に Humanクラスの、Tanaka家の、Taroが170cm、 Humanクラスの、T

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

  • C#

    5759questions

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

  • WPF

    605questions

    Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです