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

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

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

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

MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

Azure

Azureは、マイクロソフトのクラウド プラットフォームで、旧称は Windows Azureです。PaaSとIaaSを組み合わせることで、 コンピューティング・ストレージ・データ・ネットワーキング・アプリケーションなど多くの機能を持ちます。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

Q&A

解決済

3回答

4718閲覧

ASP.NET C# dictionaryのキーとListを一致しているか調べてViewで表示させたい。

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

Azure

Azureは、マイクロソフトのクラウド プラットフォームで、旧称は Windows Azureです。PaaSとIaaSを組み合わせることで、 コンピューティング・ストレージ・データ・ネットワーキング・アプリケーションなど多くの機能を持ちます。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

0グッド

0クリップ

投稿2017/02/17 02:00

編集2017/02/17 06:02

プログラムを作成しているのですが、全くわからないのでどなたか教えてください。
ASP.NET MVC5で環境はVisual Stadio2015です。
言語はC#でwebアプリケーションを作成しています。
webApiを使い外部のソフトと連動?させています。

現在は、webapiから持ってきた要素をListにいれてViewBagで
Viewに出しています。

webApiから持ってきたCordとdctionaryのマッピングされている数字を比較して同じならば、Cordとdictionaryの要素を表示したいと考えています。

例えば
{"1234", new Kamoku {Id = "10000", Name = "国語" }},
↑"1234"とwebApiから持ってきたListAbのCord()が一緒なら、"1234"と"10000"と"国語"をViewで表示したいのです。

それが出来るか否かもわかっていないのですが・・・・。

質問自体もおかしいかもしれませんが、ヒントか何かでもいただければ
うれしいです。
お願いします。

HomeController.cs

C#

1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Web; 5using System.Web.Mvc; 6using System.Text; 7using System.Net.Http; 8using System.Collections; 9using System.Web.Script.Serialization; 10using System.Threading.Tasks; 11using System.Net.Http.Headers; 12using System.Runtime.Serialization; 13using System.Runtime.Serialization.Json; 14using System.Xml.Serialization; 15 16namespace WebApplication1.Controllers 17{ 18 public class HomeController : Controller 19 { 20 string schoolBaseUrl = "https:~"; 21 string schoolDataArea = "abcde"; 22 23 //mappingsを定義 24 Dictionary<String, Kamoku> mappings = new Dictionary<String, Kamoku>() 25 { 26 {"1234", new Kamoku {Id = "10000", Name = "国語" }}, 27 {"1112", new Kamoku {Id = "10000", Name = "理科" }}, 28 {"1232, new Kamoku {Id = "10000", Name = "社会" }}, 29 {"1311", new Kamoku {Id = "10000", Name = "数学" }}, 30 {"1300", new Kamoku {Id = "10000", Name = "歴史" }}, 31 {"1400", new Kamoku {Id = "10000", Name = "英語" }}, 32 {"1178", new Kamoku {Id = "20000", Name = "体育" }}, 33 {"1423", new Kamoku {Id = "20000", Name = "宗教" }}, 34 35 36 37 public ActionResult Test() 38 { 39 try 40 { 41 Task<System.IO.Stream> response1 = postRequest(); 42 System.IO.Stream res1 = response1.Result; 43 // JSONデシリアライズ 44 var serializer1 = new DataContractJsonSerializer(typeof(PcaToken)); 45 PcaToken token = (PcaToken)serializer1.ReadObject(res1); 46 47 /* 48 Task<System.IO.Stream> response2 = getRequest(); 49 System.IO.Stream res2 = response2.Result; 50 var serializer2 = new DataContractJsonSerializer(typeof(List<CashOutUI>)); 51 List<CashOutUI> info = (List<CashOutUI>)serializer2.ReadObject(res2); 52 */ 53 54 Task<System.IO.Stream> response3 = getRequest(token.access_token); 55 System.IO.Stream res3 = response3.Result; 56 // XMLデシリアライズ 57 var serializer3 = new XmlSerializer(typeof(List<Ab>)); 58 List<Ab> Ab = (List<Ab>)serializer3.Deserialize(res3); 59 ViewBag.Ab = Ab; 60 61 62 //Task<string> response4 = getRequestStr(token.access_token); 63 //string res4 = response4.Result; 64 65 //ViewBag.Message = info.Count; 66 //ViewBag.Message = token.access_token; 67 ViewBag.Message = ""; 68 } 69 catch (Exception ex) 70 { 71 Console.WriteLine(ex.Message); 72 } 73 74 75 return View(); 76 } 77 78 79 [DataContract] 80 public class Ab 81 { 82 [DataMember] 83 public string Id { get; set; } 84 [DataMember] 85 public string Number { get; set; } 86 [DataMember] 87 public string Code { get; set; } 88 [DataMember] 89 public string Deletable { get; set; } 90 [DataMember] 91 public string Name { get; set; } 92 [DataMember] 93 94 //Kamoku クラス 95 public class Kamoku 96 { 97 public string Id { get; set; } 98 public string Name { get; set; } 99 } 100}

Test.cshtml

@{ ViewBag.Title = "Test"; } <h2>@ViewBag.Title.</h2> <h3>@ViewBag.Message</h3> @foreach (var item in ViewBag.Ab) { <p>@item.Code - @item.Name</p>

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

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

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

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

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

guest

回答3

0

定義不明のクラス、メソッド、変数が多々あって質問にアップされたソースは自分には意味不明ですが、とにかく、

List<Ab> Ab = (List<Ab>)serializer3.Deserialize(res3);

ということろで Web API から Ab クラスのコレクション List<Ab> というデータを取得する部分までは完成しているのですか?

そして、例えば、 List<Ab> の中に 2 つ Ab クラスのオブジェクトがあって、その Id がそれぞれ "1234", "1112" だった場合(あくまで例えばの話です)、mappings ディクショナリの中で key がそれに該当する kamoku クラスの中身すなわち Id = "10000", Name = "国語" と Id = "10000", Name = "理科" を View に表示するという理解で正しいですか?

その理解で正しければ、プリミティブに foreach を使って(Linq とか使ってもっとスマートにできるかもしれませんが、とりあえずそれは置いといて)以下のように kamoku クラスのコレクションを作って、それを Model として View に渡すというのはいかがですか?

List<Ab> list = (List<Ab>)serializer3.Deserialize(res3); // 変数名を list に変えました List<Kamoku> result = new List<Kamoku>(); foreach (Ab item in list) { result.Add(mappings[item.Id]); } return View(result);

上のコードは検証してませんので、あくまで感じということで。

私の理解が間違っている場合はどのように違うのか連絡ください。

投稿2017/02/17 06:21

編集2017/02/17 06:25
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2017/02/17 06:51

SurferOnWwwさん、回答ありがとうございます。 List<Ab> Ab = (List<Ab>)serializer3.Deserialize(res3);の部分は List<Ab> ab = (List<Ab>)serializer3.Deserialize(res3);となっていました。ここまでは、ちゃんとデータ取得は出来ています。 Viewの方で、番号と科目名が出てきていました。 >すなわち Id = "10000", Name = "国語" と Id = "10000", Name = "理>科" を View に表示するという理解で正しいですか? 表示させたいのは、それであっています。出来れば、"1234", "1112"も表示させたいですが、まずは "10000", Name = "国語" を一番表示させたいです。
退会済みユーザー

退会済みユーザー

2017/02/17 08:40

> 出来れば、"1234", "1112"も表示させたいですが であれば、もし Kamoku クラスに手を加えることができるのであれば、"1234" を保持できるようなプロパティを追加し、foreach のループの中でそのプロパティに "1234" を代入して result (List<kamoku>) を作って、それをモデルとして View に渡してはいかがですか? モデルとして List<kamoku> を渡すと Visual Studio のスキャフォールディングの機能を使って一覧が表示できる View を自動生成してくれるというメリットがあります。
退会済みユーザー

退会済みユーザー

2017/03/01 07:59

時間がたってしまってすみません。教えて下さりありがとうございます。 そんな機能があるんですね!! Kamokuクラスにプロパティを追加ですね。一度調べてやってみます
guest

0

LINQ(メソッド)使った場合はこうですかね。

c#

1var AbFiltered = mappings.Where((pair) => Ab.Contains(pair.Key)).ToList(); 2ViewBag.Ab = AbFiltered;

投稿2017/02/17 04:41

turbgraphics200

総合スコア4269

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

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

退会済みユーザー

退会済みユーザー

2017/02/17 05:54

回答ありがとうございます。 LINQは私自身が使ったことがないのでわからないのですが、そのようにも 出来るんですね! だた、私の質問の仕方が悪く、やりたいことが違うため今回は使えなさそうです。すみません。
turbgraphics200

2017/02/17 06:08

一応、やりたいことには沿っていると思いますが。 例えば、Ab = new List { "1234", "1112"}だった場合、AbFilterdは { {"1234", new Kamoku {Id = "10000", Name = "国語" }}, {"1112", new Kamoku {Id = "10000", Name = "理科" }} } となります。
退会済みユーザー

退会済みユーザー

2017/02/17 06:24

私がわからないだけで出来ているんですね。わざわざ説明していただいて ありがとうございます。 mappingsの要素を絞り込んでいるということですか?
退会済みユーザー

退会済みユーザー

2017/02/17 06:34

turbgraphics200さん、なんとなくですが、わかりました。 ありがとうございます。自分でもLINQ勉強しますね!!
退会済みユーザー

退会済みユーザー

2017/03/01 08:01

ありがとうございます。 私よりもプログラムがわかる人に聞いたところ、その方もLINQを勉強した方が・・・ と言っていたのでそちらの勉強もしようと思います。
guest

0

ベストアンサー

質問が変更され条件が変わったのでこれに伴い変更した。

結果としてViewに渡したいものがAPIの結果の要素(List<Ab>)ではなく Dictionary<String, Kamoku>の要素ということですね。

"1234"と"10000"と"国語"をViewで表示したい

のであればこれをViewBagに追加すればいいのでは?
※hoge は適切なものに修正して下さい。
※ 文法間違ってるかもしれませんがこんな感じで。

// ※疑似コードです。 Dictionary<String, Kamoku> hoge = new Dictionary<String, Kamoku>(); foreach (List<Ab> row in (List<Ab>)serializer3.Deserialize(res3)) { if (mappings.ContainsKey(row.Cord)) { hoge.add(row.Cord, mappings[row.Cord]); } } ViewBag.hoge = hoge;

現在は、webapiから持ってきた要素をListにいれてViewBagでViewに出しています。
webApiから持ってきたIDとdctionaryのキーの数字を比較して
同じならば、IDとdictionaryの要素を表示したいと考えています。

webapiから持ってきた要素のIDとdctionaryのキーの数字を比較して同じならば、ListにいれてViewBagでViewに出す。

でいいのでは?

投稿2017/02/17 03:07

編集2017/02/17 06:31
Y.H.

総合スコア7914

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

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

退会済みユーザー

退会済みユーザー

2017/02/17 05:52

お早い回答ありがとうございます。 試してみたのですが、うまくいきませんでした。 それと私の日本語がおかしかったので、やりたいことが少し異なって いました。すみません。 webapiから持ってきた要素のIDとマッピングで紐づけている数字と一致 するものでした。
Y.H.

2017/02/17 06:01

「マッピングで紐づけている数字」とはなんでしょう? まぁ、これが何にしろ私の回答(またはturbgraphics200さんの回答)の条件の部分を変更するだけだと思うのですが。
Y.H.

2017/02/17 06:05

> IDとdictionaryの要素を表示したいと考えています。 もしかして ViewBagに設定するもの(オブジェクトの型)自体が今とは異なるということでしょうか?(さすがにそこまで「コード全部書いてください」的な質問ではないですよね?)
退会済みユーザー

退会済みユーザー

2017/02/17 06:07

例の{"1234", new Kamoku {Id = "10000", Name = "国語" }}, でいうと ”1234”の数字です。 dictionaryを作る際に、”1234”と{Id・Name}を紐づけているだと思ったんですが、違うでしょうか? 私の理解度が低いので変更するのもよくわからず・・・。度々すみません。
退会済みユーザー

退会済みユーザー

2017/02/17 06:14

>もしかして ViewBagに設定するもの(オブジェクトの型)自体が今とは異なるということでしょうか?(さすがにそこまで「コード全部書いてください」的な質問ではないですよね?) コードを全部書いてくださいというようなお願いではありません。 全部書いてもらっては勉強にもなりませんし、図々しい質問になってしまっていたら、申し訳ありません。 教えていただける範囲で構いません。
Y.H.

2017/02/17 06:34 編集

やっと言っていることがわかりました。 果としてViewに渡したいものがAPIの結果の要素(List<Ab>)ではなく Dictionary<String, Kamoku>の要素ということですね? turbgraphics200さんの回答のようにLINQで書いた方がシンプルに書けます。
退会済みユーザー

退会済みユーザー

2017/02/17 06:33

そうです!! 説明が下手なのに、理解していただけて嬉しいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問