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

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

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

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

WPF

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

Q&A

解決済

2回答

2003閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

WPF

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

0グッド

1クリップ

投稿2017/12/09 20:07

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

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

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

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

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

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

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

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

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

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

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

guest

回答2

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.成績["算数"]);

投稿2017/12/10 01:15

編集2017/12/10 01:16
gazette2

総合スコア179

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

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

0

ベストアンサー

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

C#

1class 成績{ // (1) 2 public int 国語{ get; set; } 3 public int 算数{ get; set; } 4} 5 6class 生徒{ // (2) 7 private string 名前{ get; set;} 8 public 成績 成績{ private set; get; } 9 10 public 生徒(string name){ // (3) 11 this.名前 = name; 12 this.成績 = new 成績(); 13 } 14} 15

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

以下のようにつかう。

C#

1var taro = new 生徒("たろう"); 2taro.成績.国語 = 78; 3taro.成績.算数 = 88; 4 5var hanako = new 生徒("はなこ"); 6hanako.成績.国語 = 78; 7hanako.成績.算数 = 88;

投稿2017/12/10 00:03

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2017/12/10 05:36

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問