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

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

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

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

Q&A

解決済

3回答

588閲覧

C# ケース文での値の代入について

ShouOkada

総合スコア46

C#

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

0グッド

0クリップ

投稿2017/10/19 13:47

区分によって対応するプロパティに値を入れていきたいのですが、右辺は同じなのに左辺が違うだけで下記ソースのように記述するのは冗長に思えます。

なので、簡潔に書く方法があれば教えてください。

var list = new List<Data>(); foreach ( var data in dataList) { var model = new Data; switch (data.Kbn) { case "1": model.KingakuA = data.kingaku; model.SuryoA = data.suryo; model.TankaA = data.tanka; break; case "2": model.KingakuB = data.kingaku; model.SuryoB = data.suryo; model.TankaB = data.tanka; break; case "3": model.KingakuC = data.kingaku; model.SuryoC = data.suryo; model.TankaC = data.tanka; break; case "4": model.KingakuD = data.kingaku; model.SuryoD = data.suryo; model.TankaD = data.tanka; break; default: break; } list.Add(model); }

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

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

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

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

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

guest

回答3

0

直接的な回答ではないのですが、これは設計がいけてないような気がしますね。
データを横持ちにしているとこういうことが起きます。
(レコードで持つのではなくカラムで持つ)

こういうデータの持ち方は、画面表示が横になっていると、
そのまま表示できるので便利ではあるのですが、拡張性が皆無なのであまりお薦めはしません。
例えば区分に「5」が増えた場合は、KingakuEを足すという悲惨なことになっていきます。

そもそもこれって、A~Dのいずれかにしか値は入らないですよね。
AとCに入るパターンとかってのがないってことです。
そうなると、ますます横持ちに持っている意味がないような気がします。

dataListはレコードとして縦持ちに持っているので、
dataListが持っているdataの状態でいいと思います。
この状態であれば、ある程度Linqでどうとでもなりそうですし。
例えば区分「1」の合計数量とかであれば、以下のような感じでとれます。

C#

1var sum = list.Where(d => d.Kbn == "1").Sum(d => d.Suryo);

投稿2017/10/19 16:10

root_jp

総合スコア4666

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

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

ShouOkada

2017/10/21 02:21

わかりました、ありがとうございますm(__)m
guest

0

ベストアンサー

解答にならないかと思いますが、

C#

1class Model { 2 KST[] abcd = new KST[4]; 3} 4class KST { 5 int Kingaku; 6 int Suryo; 7 int Tanka; 8 9 KST(int kingaku, int suryo, int tanka) { 10 Kingaku = kingaku; 11 Suryo = suryo; 12 Tanka = tanka; 13 } 14}

という雰囲気の設計ではいけないのだろうかと思いました。上記のように設計してあれば、冗長さはでてこないように思います。

C#

1// どこかのstaticフィールド 2static Dictionary<string, int> Kubun2Index = new Dictionary<string, int> { 3 { "1", 0 }, {"2", 1 }, ... 4}; 5... 6 7var list = new List<Data>(); 8foreach (var data in dataList) { 9 if (Kubun2Index.ContainsKey(data.Kbn)) { 10 var model = new Model(); 11 model.abcd[Kubun2Index[data.Kbn]] = new KST(data.kingaku, data.suryo, data.tanka); 12 list.Add(model); 13 } else { 14 Console.WriteLine("区分が不当です。無視しました。"); 15 } 16}

同じような種類のものが複数あるなら配列なり、まとまった単位でクラスなりにして纏めないと、ご質問のような状況に簡単に陥る気がします。

投稿2017/10/19 15:12

KSwordOfHaste

総合スコア18394

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

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

KSwordOfHaste

2017/10/19 16:30

本質的でないコメントですが、自分の回答でKSTなんてヘンテコな名前のクラスにしてしまいました。多分他の閲覧者の方は「ひどいセンスだなぁ・・・せめてそれっぽい名前にすればいいのに」と思われたと思います。Kingaku, Suryo, Tankaの頭文字を並べちゃいました。スミマセン
ShouOkada

2017/10/21 02:21

わかりました、ありがとうございますm(__)m
guest

0

Dataの各プロパティは配列として定義できるかと思います。

投稿2017/10/19 14:50

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

ShouOkada

2017/10/21 02:22

わかりました、ありがとうございますm(__)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問