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

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

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

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

WPF

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

Q&A

解決済

1回答

2236閲覧

Combobox内の選択アイテムと、リスト内のelementの一致、という条件設定の仕方

irm

総合スコア25

C#

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

WPF

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

0グッド

0クリップ

投稿2019/01/13 09:29

編集2019/01/14 09:54

コードの細かな書き方について質問です。
上記List<Transaction>transactionsがあります。

transactions内の、あるひとつのelement(例えばtransactionという変数でくくる)の中に、account.ToString()を見つけ出したいです。

質問1.var transaction などの変数をつくり、account.ToString()を抽出したいです。(使用メソッドは、Containsでいいのでしょうか。それとも、FirstOrDefaultでしょうか。)

その後、

  1. コンボボックス(ドロップダウンメニューのようなもの)の選択されたitem
  2. 前述のtransactions内にある任意の内のelement内のaccount.ToString()

1と2が同じである時(if(1==2){})、という条件設定が必要なのですが、どういう風に書けるでしょうか?

そこで質問2ですが、下記コードの日本語部分に該当するコードの書き方が知りたいです。

前回質問がコードの方向性的なざっくりした内容だったのですが、こちらはのちの具体的部分になるかと思います。まだ、場数をこなしていないため、コードの細かな書き方がわかりにくいです。よろしくお願いします。

C#

1if (Combobox1.SelectedItem.ToString().Equals(transactionsに含まれるaccount.ToString()を表すためのコード)) 2{ 3 //リスト表示 4 Listbox1.Items.Add(transactionsのパラメーターであるdate, transactionType,depAmountを表示させたいです。); 5}

簡単に言ってしまうと、上記if文のカッコ内は、コンボボックスの選択中のアイテム(口座タイプ、アカウントナンバー)と、ローカル変数であるaccount.ToString()(口座タイプ、アカウントナンバー)の照合です。

しかし、もっと言うと、アカウントナンバー自体は、BankAccountという親クラスにプロパティがあります。
var account = Combobox1.SelectedItem as BankAccount;このようにして、asオペレーターでBankAccountにあるプロパティのようにふるまわせています。
Transactionクラスはあくまで以下のプロパティしかもっておらず、BankAccountクラスとはアソシエーションの関係にあります…。

よって、BankAccount内のAccountNumberプロパティを直接照合させて使うこともできるはずなのですが(そのほうがややこしくなさそうです)、object.AccountNumberとするためには、オブジェクトが必要になりそうです。

C#

1namespace practice 2{ 3 [Serializable] 4 class Transaction 5 { 6 internal bool AccountNumber; 7 public double Amount { get; set; } 8 public DateTime Date { get; set; } 9 public string TransactionType { get; set; } 10 public List<BankAccount> BankAccounts { get; private set; } = new List<BankAccount>(); 11 12 13 // Constructors 14 public Transaction(DateTime date, string transactionType, double amount, string s) 15 { 16 Amount = amount; 17 Date = DateTime.Now; 18 TransactionType =transactionType ; 19 20 } 21 22 // Methods 23 public override string ToString() 24 { 25 return $"\n{Date} {TransactionType}: {Amount}SEK "; 26 }

クラス図のクラス名は、コード上では、Accout→BankAccount,History→Transactionとなっています。

イメージ説明

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

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

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

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

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

YAmaGNZ

2019/01/14 02:53 編集

Transactionクラスはどのような定義なのでしょうか? また、transactions内に同一のaccountがある場合、どのように抽出するのでしょうか?
irm

2019/01/14 08:47 編集

ありがとうございます。Transactionクラスのコードを追加しました。Transactionクラスの中にAccountNumberのプロパティがあると、口座番号からどの情報を表示させたらいいかの特定ができるのですが、BankAccountクラス内にAccountNumberプロパティがあるために、よくわからなくなってしまっています…。クラス図はちなみに、前回の質問に掲載してあります。全体のコードは膨大すぎてちょっと掲載しきれなそうです。
YAmaGNZ

2019/01/14 09:24

前回の質問のクラス図と言われても、TransactionクラスもBankAccountクラスも書いてありませんが・・・
irm

2019/01/14 09:29

UMLのクラスダイアグラムの画像なのですが。見られないでしょうか。
irm

2019/01/14 09:33

ちなみにUMLのクラス名ですが、 Accountクラス=BankAccoutクラス Historyクラス = Transactionクラス です。
guest

回答1

0

ベストアンサー

現状のTransactionクラスでは質問にある「account.ToString()」が保持されるような作りになっていません。
コンストラクタでstring sと指定していますが、このsは使用されていません。
ですので、照合しようと思っても不可能です。
まずは、TransactionクラスにてAccountプロパティなり、コンストラクタで指定されているsを保持しクラス外で参照できるようにしてください。

質問内容からずれていますね。

C#

1// リストにある条件をみたす最初のアイテム 2var item = transactions.First(a => a.該当プロパティ == "条件"); 3// リストにある条件をみたす複数のアイテム 4var items = transactions.Where(a => a.該当プロパティ== "条件");

とやればリストから抽出できるかと思います。
現状ですと、該当プロパティが不明のため、その部分を実装しないとダメですが・・・

投稿2019/01/14 09:23

編集2019/01/14 22:36
YAmaGNZ

総合スコア10222

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

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

irm

2019/01/14 16:09 編集

ありがとうございます。string sの件ですが、まさにaccount.toString();をメインプログラムで使うために後付けしたパラメーターでして…。単純にtransactionの該当リストに直接アクセスする方法があればよいのですが、Transactionクラス外にある口座番号情報ないことには該当情報にアクセスができず…。設問ミスのようなものなのでしょうかね。
YAmaGNZ

2019/01/14 22:18

Transactionクラスは履歴のようですから、このクラスで保持する情報は ・取引日時 ・取引種別 ・取引金額 ・取引者 ・取引相手 だと思われます。ソースを見ると、「取引者」と「取引相手」の実装が不明です。(ここに書いた項目が必要なのかも私には分かりませんが) このあたりを整理して考えてください。
irm

2019/01/15 11:15

ありがとうございます。そうですね。Transactionクラスのプロパティをリスト化して、預金と引き出しのイベントごとに保存するようにしているのですが、そこに他クラスにある口座番号が必要になると思われます。しかし他クラスにある口座番号AccountNumberの使い方がわからず…。ローカル変数をつくり、リストに口座番号要素を一時的に追加して、どのtransactionのことなのかを特定するということなのでしょうか。混乱してきます。
YAmaGNZ

2019/01/15 11:38

Transactionクラスのプロパティをリスト化して複数の取引の事象を持つのではなく、Transactionクラスは1回の取引情報とすべきかと思います。 それで、イベント毎にTransactionクラスを生成し、List<Transaction>に追加していくのではないでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問