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

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

ただいまの
回答率

90.50%

  • C#

    7121questions

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

  • ASP.NET

    529questions

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

  • MVC

    224questions

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

  • Azure

    212questions

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

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 977

Yumiko

score 10

プログラムを作成しているのですが、全くわからないのでどなたか教えてください。
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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Text;
using System.Net.Http;
using System.Collections;
using System.Web.Script.Serialization;
using System.Threading.Tasks;
using System.Net.Http.Headers;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using System.Xml.Serialization;

namespace WebApplication1.Controllers
{
    public class HomeController : Controller
    {
        string schoolBaseUrl = "https:~";
        string schoolDataArea = "abcde";

        //mappingsを定義
        Dictionary<String, Kamoku> mappings = new Dictionary<String, Kamoku>()
        {
            {"1234", new Kamoku {Id = "10000", Name = "国語" }},
            {"1112", new Kamoku {Id = "10000", Name = "理科" }},
            {"1232, new Kamoku {Id = "10000", Name = "社会" }},
            {"1311", new Kamoku {Id = "10000", Name = "数学" }},
            {"1300", new Kamoku {Id = "10000", Name = "歴史" }},
            {"1400", new Kamoku {Id = "10000", Name = "英語" }},
            {"1178", new Kamoku {Id = "20000", Name = "体育" }},
            {"1423", new Kamoku {Id = "20000", Name = "宗教" }},



        public ActionResult Test()
        {
            try
            {
                Task<System.IO.Stream> response1 = postRequest();
                System.IO.Stream res1 = response1.Result;
                // JSONデシリアライズ
                var serializer1 = new DataContractJsonSerializer(typeof(PcaToken));
                PcaToken token = (PcaToken)serializer1.ReadObject(res1);

                /*
                Task<System.IO.Stream> response2 = getRequest();
                System.IO.Stream res2 = response2.Result;
                var serializer2 = new DataContractJsonSerializer(typeof(List<CashOutUI>));
                List<CashOutUI> info = (List<CashOutUI>)serializer2.ReadObject(res2);
                */

                Task<System.IO.Stream> response3 = getRequest(token.access_token);
                System.IO.Stream res3 = response3.Result;
                // XMLデシリアライズ
                var serializer3 = new XmlSerializer(typeof(List<Ab>));
                List<Ab> Ab = (List<Ab>)serializer3.Deserialize(res3);
                ViewBag.Ab = Ab;


                //Task<string> response4 = getRequestStr(token.access_token);
                //string res4 = response4.Result;

                //ViewBag.Message = info.Count;
                //ViewBag.Message = token.access_token;
                ViewBag.Message = "";
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }


            return View();
        }


 [DataContract]
    public class Ab
    {
        [DataMember]
        public string Id { get; set; }
        [DataMember]
        public string Number { get; set; }
        [DataMember]
        public string Code { get; set; }
        [DataMember]
        public string Deletable { get; set; }
        [DataMember]
        public string Name { get; set; }
        [DataMember]

    //Kamoku クラス
    public class Kamoku
    {
        public string Id { get; set; }
        public string Name { get; set; }
    }
}

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>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

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 14:52

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

    キャンセル

  • 2017/02/17 15:01

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

    キャンセル

  • 2017/02/17 15:05

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

    キャンセル

  • 2017/02/17 15:07

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

    キャンセル

  • 2017/02/17 15:14

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

    キャンセル

  • 2017/02/17 15:29 編集

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

    キャンセル

  • 2017/02/17 15:33

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

    キャンセル

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/17 14:54

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

    キャンセル

  • 2017/02/17 15:08

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

    キャンセル

  • 2017/02/17 15:24

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

    キャンセル

  • 2017/02/17 15:25

    ええ、そういうことです。

    キャンセル

  • 2017/02/17 15:34

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

    キャンセル

  • 2017/02/17 15:35

    頑張ってください。

    キャンセル

  • 2017/03/01 17:01

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

    キャンセル

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 15: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 17:40

    > 出来れば、"1234", "1112"も表示させたいですが

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

    キャンセル

  • 2017/03/01 16:59

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

    キャンセル

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

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C#

    7121questions

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

  • ASP.NET

    529questions

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

  • MVC

    224questions

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

  • Azure

    212questions

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