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

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

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

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

Q&A

解決済

3回答

5529閲覧

構造体からの値の取り出しについて

Qoo

総合スコア1249

C#

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

0グッド

0クリップ

投稿2019/02/24 07:02

カテゴリリストの構造体クラスを作成しました。

public class CategoryList { public string modelno; public string modename; public string Category1; public string Category2; public static void InitCategoryDic(List<int> no,List<string> ListModelNo,List<string> ListModelName,List<string> ListCstrgory1,List<string> ListCstrgory2) { Dictionary<int,CategoryList> dic = new Dictionary<int,CategoryList> (); for (int i = 0; i < no.Count; i++) { dic.Add (no[i], new CategoryList{modelno = ListModelNo[i], modename=ListModelName[i], Category1 = ListCstrgory1[i], Category2 = ListCstrgory2[i] }); } } }

構造体への値のセットについては、調べながらうまく値のセットを行うことができたのですが、
今度、構造体から値を取り出す方法について、教えて頂きたいのですが、
foreach (CategoryList categorylist in ???? ) ← ???の部分はどのように指定すればよいのでしょうか?

public class MainTitle : MonoBehaviour { void testadd() { int cnt=0; List<int> Cnt = new List<int>(); List<string> ListModelNo = new List<string>(); List<string> ListModelName = new List<string>(); List<string> ListCategory1 = new List<string>(); List<string> ListCategory2 = new List<string>(); for (int i = 0; i < 10; i++) { cnt +=1; Cnt.Add(cnt); ListModelNo.Add("ModelNo"+cnt); ListModelName.Add("ModelName"+cnt); ListCategory1.Add("Cstrgory1"+cnt); ListCategory2.Add("Cstrgory2"+cnt); } CategoryList.InitCategoryDic(Cnt,ListModelNo,ListModelName,ListCategory1,ListCategory2); } public static List<CategoryList> getCategoryList(int no){ List<CategoryList> result = new List<CategoryList>(); foreach (CategoryList categorylist in ???? ) { if (categorylist.no == no) { result.Add (categorylist.ListModelName ); } } return result; } }

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

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

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

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

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

guest

回答3

0

構造体への値のセットについては、

と言うのは、InitCategoryDic()メソッドの事でしょうか?
ここで、dicという変数に値をセットしていますが、この変数は、メソッド内の変数なので、メソッドの実行が終わった時点で、消えています。従って、この変数の値を他から、参照する事はできません。(Visual Studioだと Warningが出ないか?)

もし、参照するならば、例えば、クラス CategoryList

C#

1 public static Dictionary<int,CategoryList> dic;

の宣言を追加し、こちらに値をセットする必要があります。 (安易なので、あまり推奨できませんが、他の方法は変更が大きい)
そして、

foreach (CategoryList categorylist in ???? ) {

は、以下のようになるのではないかと。(もしかすると、キャストが必要?)

C#

1 foreach (KeyValuePair<int, CategoryList> kvp in CategoryList.dic) { 2 if (kvp.Key == no) { 3 result.Add(kvp.Value.ListModelName); 4 } 5 }

投稿2019/02/24 10:00

pepperleaf

総合スコア6383

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

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

Qoo

2019/02/24 13:02

回答ありがとうございます。 まだ理解できていないのですが、 dic.Add (no[i], new CategoryList{modelno = ListModelNo[i], modename=ListModelName[i], Category1 = ListCstrgory1[i], Category2 = ListCstrgory2[i] }); のところで、確かにdicはローカル変数だと思うのですが、new CategoryList・・のところで Classの構造体の方にも追加されているものだと思っていたのですが、そういうものではないのでしょうか?? ちなみに今回のテストスクリプトは下記を参考にしました。 このサイトでもdic はローカル変数になっているのですが、クラスの方から値を取得しているような例になっているのですが、こちらも間違いなのでしょうか?? http://sleepnel.hatenablog.com/entry/2016/07/25/172000
MMashiro

2019/02/25 11:10

リンク先見てみましたが、恐らくあくまで例として出してるだけだと思います。 普通に使うには変数dicを外に出したり、引数に渡すなどする必要があります new CategoryListしていますがそのnewの結果をローカル変数のdicに入れてしまっているのでdicは関数を抜けた後どこからも参照されてない為消えてしまいます。
guest

0

ベストアンサー

前提としてクラスと構造体は別ものです。
で、構造体に値を保存できてないので、もう一度参考資料に戻ってください。
もし、今参照している資料でこれができあがっているなら、別の資料を探してください。

下記に、おそらくこうしたいんじゃないかな、というのを書いておきますが、説明は参考書をあたってください。
(vsで書いてないのでエラーがあったらごめんなさい)

csharp

1public struct Category //structとclassはちがう 2{ 3 public string ModelNo; //Noがstringっていうのは最悪です 4 public string ModelName; 5 puglic string Category1; //CategoryならEnumとかにできませんかね。文字っていうのは良くない 6 public string Category2; //カテゴリが複数なら配列かタプルにしたほうがよいのでは? 7 public Category(string modelNo, string modelName, string cat1, string cat2) //コンストラクタはこういう構文 8 { 9 ModelNo = modelNo; 10 ModelName = modelName; 11 Category1 = cat1; 12 Category2 = cat2; 13 } 14} 15 16public class MainTitle : MonoBehaviour { 17 private List<Category> _listOfCategory; //リストをプライベートに保持 18 19 void testadd() { 20 _listOfCategory = new List<Category>(); //リストを初期化 21 foreach(var i in Enumerable.Range(1, 10)) //1から10をiでとる 22 { 23 _listOfCategory.Add(new Category($"ModelNo{i}",$"ModelName{i}",$"Cstrgory1{i}",$"Cstrgory1{i}"));//構造体をnewして、リストに追加 24 } 25 } 26 27 public static List<Category> getCategoryList() //全部取る 28 { 29 return _listOfCategory; 30 } 31 public static Category getCategoryOfNth(int no) //no番目を取るなら返り値はListではない。おかしいですよね。2番目が3個も4個もあるなんていうのは。 32 { 33 return _listOfCategory[no - 1]; 34 } 35 public static List<Category> getCategoryByName(int no) //foreachのサンプルのために、名前にnoの数字の文字を含むものを取得するパターンを提示 36 { 37 List<CategoryList> result = new List<CategoryList>(); 38 foreach(Category cat in _listOfCategory) 39 { 40 if(cat.ModelNo.indexOf(no.ToString()) != -1) 41 { 42 result.Add(cat); 43 } 44 } 45 return result; 46 } 47}

投稿2019/02/26 02:31

papinianus

総合スコア12705

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

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

Qoo

2019/03/01 03:01

ありがとうございました!
guest

0

getCategoryListですが、noをDictionaryのキーにしているので、返すCategoryListは必ず1件になるので、List<CategoryList>である必要がないのでは?
また、noListModelNameCategoryListのメンバーとして存在していません。
resultList<CategoryList>なのにAddしているものが異なるなど
???の部分だけでなく、こちらも修正が必要かと思います

投稿2019/02/24 12:32

YAmaGNZ

総合スコア10258

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

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

Qoo

2019/02/24 13:04

回答ありがとうございます。 まだ良く理解できていないので、どのように修正して良いのかが理解できていない状況です。 可能でしたら、どのように修正すべきなのか、どんな方法があるのかをアドバイスしていただける方が助かります。
YAmaGNZ

2019/02/25 10:29

クラス外からアクセスする場合publicにしているメンバーにだけアクセスすることが可能です。 ですので、CategoryListクラスの場合はmodelno、modename、Category1、Category2のメンバー変数と InitCategoryDicメソッドのみとなります。 getCategoryListに関して、私にはこれでどのようなデータが欲しいのか分かりませんので、どのように修正するのが正解なのかが分かりません。 具体的なデータのリストからどのようなデータが欲しいのか整理してみてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問