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

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

ただいまの
回答率

90.34%

  • C#

    9671questions

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

C#でdictionaryのvalueにkey毎に任意の型は使えますか?

受付中

回答 3

投稿

  • 評価
  • クリップ 1
  • VIEW 5,365
退会済みユーザー

退会済みユーザー

C#でdictionaryを使いたいのですが、keyによってvalueに任意の型を指定することは可能でしょうか?

例えば(C#の書き方ではありませんが)

dic['name'] = ['apple', 'orange', 'grape']
dic['price'] = [200, 300, 150]

のように

keyが'name'の場合のvalueの型はList<string>
keyが'price'の場合のvalueの型はList<int>

というような感じです。
動的型付け言語のようにしたいのです。

そもそもC#ではこのような使い方はしないのでしょうか?
pythonとかは上記のように簡単にdictを作れるので楽だったのですがC#では別の手法か何かを使う感じですか?

現状だと

List<string> name  = new List<string>();
List<int>    price = new List<int>();


のように別けて利用しています。

どうぞよろしくお願い致します。

環境:
Windows10 + Visual Studio 2015

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

+1

IntelliSenseは効きませんが、dynamicを使用するのはいかがでしょうか。

var dic = new Dictionary<string, dynamic>();
dic.Add("name", new List<string>{ "apple", "orange", "grape" });
dic.Add("price", new List<int>{ 200, 300, 150 });

dic["name"].Add("banana");
dic["price"].Add(400);

使用用途にもよると思いますが、c#においては他に、

  • Dictionary<string, object>を使用し、キャストする方法
var dic = new Dictionary<string, object>();
dic.Add("name", new List<string> { "apple", "orange", "grape" });
dic.Add("price", new List<int> { 200, 300, 150 });

((List<string>)dic["name"]).Add("banana");
((List<int>)dic["price"]).Add(400);
  • Dictionary<string, int>を使用する方法
var dic = new Dictionary<string, int>();
dic.Add("apple", 200);
dic.Add("orange", 300);
dic.Add("grape", 150);
  • nameとpriceをメンバーに持つクラスを定義してList<T>で管理する方法
class Fruit
{
    public string Name { get; set; }
    public int Price { get; set; }
}
var list = new List<Fruit>();
list.Add(new Fruit { Name = "apple", Price = 200 });
list.Add(new Fruit { Name = "orange", Price = 300 });
list.Add(new Fruit { Name = "grape", Price = 150 });

等があると思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/05/17 17:09

    ありがとうございます!
    4種類もやり方を教えていただけるとは・・・!
    非常に参考になります、2番目のDictionary<string, object>でキャストする方法を試してみようと思います!

    キャンセル

0

https://ideone.com/Bk7Yku

こんな感じでいかがでしょうか。

using System;
using System.Collections.Generic;

namespace TeraTail35197
{
    class Program
    {
        class Data
        {
            public List<string> names;
            public List<int> prices;
        }

        static void Main(string[] args)
        {
            var data = new List<Data>()
            {
                new Data()
                {
                    names = new List<string> { "Apple", "Orange", "Grape" },
                    prices = new List<int> { 200, 300, 150 }
                },
                new Data()
                {
                    names = new List<string> { "Carrot", "Tomato", "Cucumber" },
                    prices = new List<int> { 100, 200, 300 }
                },
            };

            foreach (var x in data)
            {
                foreach(var name in x.names)
                {
                    Console.WriteLine($"name: { name }");
                }

                foreach (var price in x.prices)
                {
                    Console.WriteLine($"price: { price }");
                }
            }
        }
    }
}

実行結果

name: Apple
name: Orange
name: Grape
price: 200
price: 300
price: 150
name: Carrot
name: Tomato
name: Cucumber
price: 100
price: 200
price: 300

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/05/17 17:08

    ありがとうございます!
    クラスを作るのですね。

    キャンセル

0

dictionaryをどのように処理していくかわからないので使えるかわかりませんが匿名型+配列の暗黙の型指定で以下のような書き方もできます。

var data = new
{
    name = new [] { "Apple", "Orange", "Grape" },
    price = new [] { 200, 300, 150 }
};

以下の記事も参考になるかと思います。
neue cc - C#でローカル変数からDictionaryを生成する

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/05/18 14:54

    ありがとうございます!
    匿名型というのを知りませんでした…。
    そしてリンク先の記事を読んで、LINQを組み合わせるととても便利ですね!
    非常に参考になりました!

    キャンセル

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

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

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

  • C#

    9671questions

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