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

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

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

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

Q&A

解決済

1回答

462閲覧

【Unity】2つのListの要素が一致しているか調べる方法

Matsuri_

総合スコア15

C#

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

0グッド

0クリップ

投稿2022/09/23 02:18

前提

Unityで、ホテル用ベッドメイキングの
チェックリストアプリを作っています。
部屋ごとにベッドが複数あり、チェックを押したら、
どの部屋のどの番号のベッドがチェックされたのかを
Listに保管しています。
このListはクラスのListで、int型の変数を2つ持っています。
(部屋番号とベッド番号)

実現したいこと

あるボタン(Closeボタン)を押したときに、
すべての部屋のベッドがチェックされたかどうかを確認したいです。

すべてのベッドのリストと、チェックされたベッドのリストを比較し、
同じ要素があればそれをさらに別のリストに入れ、
その総数がベッドの総数と一致しているかを調べたいです。
(もし一致していなかったら、お知らせが出ます)

発生している問題

FindAllというメソッドを使って、
共通の値を持ったクラスを見つけたいと思ったのですが、
どのように記述すればうまくいくのかわかりません。

該当のソースコード

Unity

1public class BedPanelCon : MonoBehaviour 2{ 3 4 //チェックされたベッド 5 public List<BedData> bedDataList; 6 7 //ホテルのすべてのベッド 8 public List<OriginalBedData> originalBeddataList; 9 10 // 11 public List<CloseBedCheck> closeBedCheckList; 12 13 14 public void Start() 15 { 16  bedDataList = new List<BedData>(); 17 originalBeddataList = new List<OriginalBedData>(); 18 closeBedCheckList = new List<CloseBedCheck>(); 19 20//…中略 21 22public void PushBedButtonMakinglist(int roomNO, int BedNo) 23 { 24 BedData b = new BedData(); 25 b.RoomNo = roomNO; 26 b.BedNo = BedNo; 27 bedDataList.Add(b); 28 } 29 30public void MakingOriginalBedDatalist(int roomNO, int BedNo) 31 { 32 OriginalBedData d = new OriginalBedData(); 33 d.RoomNo = roomNO; 34 d.BedNo = BedNo; 35 originalBeddataList.Add(d); 36 } 37 38[System.Serializable] 39public class BedData 40{ 41 public int RoomNo; 42 public int BedNo; 43} 44 45[System.Serializable] 46public class OriginalBedData 47{ 48 public int RoomNo; 49 public int BedNo; 50} 51 52//以下のボタンを押したとき、未チェックのベッドがあるか確認する処理をしたいです。 53public void PushClose() 54 { 55   //以下の書き方だと、エラーが出ます。 56 closeBedCheckList = bedDataList.FindAll(originalBeddataList.Contains); 57 58//…中略 59 60 }

エラー文を読んでもまだ理解できる力がありません。
(エラー文:メソッドグループからPredicate<BedData>へ変換することはできません)
また、ひとつの変数ではなく、Listに格納されたクラスの中の変数を調べるには
どのようにしたらよいでしょうか。

おわかりの方いましたら、ご教授頂ければ幸いです。

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

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

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

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

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

ozwk

2022/09/23 02:56

BedDataとOriginalBedDataでクラスが分かれている意味はなんですか?
Zuishin

2022/09/23 03:02

Equals をオーバーライドして他のオブジェクトと同じ値かどうかを自己言及させるとロジックが簡単になります。 あるいは「部屋番号-ベッド番号」という文字列に変換すると HashSet が使えるようになります。 > メソッドグループからPredicate<BedData>へ変換することはできません これは関数呼び出しのカッコを忘れた時に出るメッセージです。
Matsuri_

2022/09/23 13:45

ozwkさん BedDataとOriginalBedDataでクラスが分かれている意味はなんですか? への回答になります。 まず、個々のリストに何を記録しているかですが、 BedDataはチェックされたベッド(ベッドメイクが終わったベッドのリスト)で、 OriginalBedDataはホテルにあるすべてのベッドのリスト(チェックされたかどうかは関係ないです) になります。 クラスが分かれている意味ですが、 以下の処理を実行するために、それぞれ分けなければいけないと思っていました。 1.ベッドメイクが終わったら、ベッドのボタンを押してチェックを入れる。 2.BedDataにそのベッドのルームナンバーとベッドナンバーが記録される。 3.Closeボタン(終了ボタン)を押したとき、OriginalBedDataに記録されているすべてのホテルのベッドと、BedDataに記録されたホテルのベッドが一致しているかどうかを確認する。 そもそも、上記の方法(ルームナンバーとベッドナンバーの変数を持ったクラスを作っていく)で正しい処理なのかどうかわかりません。 もっといい方法があれば、教えて頂けると幸いです。 よろしくお願い致します。
Zuishin

2022/09/23 14:05

正しいか正しくないかで言えば、意図通りの仕事ができるソフトが正しいのでこれはダメ。 それとは別にソースがダサいかダサくないかで言えば、むちゃくちゃダサくて保守性も生産性も低いので、書き直せるなら全部書き直しするのがいい。 でも人材がいないのにそんな無理を言っても仕方がないので、意図通りの動きを目指せばそれでいい。
Matsuri_

2022/09/23 15:26 編集

Zuishinさん 攻撃的な回答は求めていませんので、 次回からこちらへの書き込みを控えてくださるよう、よろしくお願いいたします。
ozwk

2022/09/23 21:37 編集

ソフトウェアの正しさとはまず第一に意図通りの仕事ができるということなので、そういった意味では正しくないです。 それとは別に保守性や生産性の観点で言えば、どちらも低そうという点で筋が悪いので、状況が許すならば全部書き直しをおすすめします。 とはいえ人材がいないのにそんな無理を言っても仕方がないので、意図通りの動きを目指せばそれでいいと思います。
Zuishin

2022/09/23 22:26

求められる本当のことを言っただけで攻撃などしていない。そのような攻撃的なコメントは求めていないので、よそでどうぞ。
Zuishin

2022/09/23 22:32

あなたの言う「正しい」の意味がわからなかったため、それを「ダサくない」の意味かと解釈しただけなので、ちゃんと伝わる言葉を書くようにすればそのような評価は読まずに済んだはず。
Matsuri_

2022/09/23 22:42

ZuishinさんのオーバーライドやHashsetなども知らなかったので、調べてみますね。 ありがとうございました。
guest

回答1

0

自己解決

他のコミュニティにおいて、クラスのリストは作らず、変数を書き換える形で解決する方法を教えて頂き、
解決致しました。

投稿2022/09/23 22:34

Matsuri_

総合スコア15

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問