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

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

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

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

Q&A

3回答

18959閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

0グッド

1クリップ

投稿2016/05/17 06:13

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#では別の手法か何かを使う感じですか?

現状だと

c#

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

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

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

環境:
Windows10 + Visual Studio 2015

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

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

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

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

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

guest

回答3

0

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

lang

1var dic = new Dictionary<string, dynamic>(); 2dic.Add("name", new List<string>{ "apple", "orange", "grape" }); 3dic.Add("price", new List<int>{ 200, 300, 150 }); 4 5dic["name"].Add("banana"); 6dic["price"].Add(400);

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

  • Dictionary<string, object>を使用し、キャストする方法

lang

1var dic = new Dictionary<string, object>(); 2dic.Add("name", new List<string> { "apple", "orange", "grape" }); 3dic.Add("price", new List<int> { 200, 300, 150 }); 4 5((List<string>)dic["name"]).Add("banana"); 6((List<int>)dic["price"]).Add(400);
  • Dictionary<string, int>を使用する方法

lang

1var dic = new Dictionary<string, int>(); 2dic.Add("apple", 200); 3dic.Add("orange", 300); 4dic.Add("grape", 150);
  • nameとpriceをメンバーに持つクラスを定義してList<T>で管理する方法

lang

1class Fruit 2{ 3 public string Name { get; set; } 4 public int Price { get; set; } 5}

lang

1var list = new List<Fruit>(); 2list.Add(new Fruit { Name = "apple", Price = 200 }); 3list.Add(new Fruit { Name = "orange", Price = 300 }); 4list.Add(new Fruit { Name = "grape", Price = 150 });

等があると思います。

投稿2016/05/17 08:03

TAKA_0921

総合スコア234

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

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

退会済みユーザー

退会済みユーザー

2016/05/17 08:09

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

0

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

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

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

投稿2016/05/18 01:47

sho_cs

総合スコア3541

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

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

退会済みユーザー

退会済みユーザー

2016/05/18 05:54

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

0

https://ideone.com/Bk7Yku

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

cs

1using System; 2using System.Collections.Generic; 3 4namespace TeraTail35197 5{ 6 class Program 7 { 8 class Data 9 { 10 public List<string> names; 11 public List<int> prices; 12 } 13 14 static void Main(string[] args) 15 { 16 var data = new List<Data>() 17 { 18 new Data() 19 { 20 names = new List<string> { "Apple", "Orange", "Grape" }, 21 prices = new List<int> { 200, 300, 150 } 22 }, 23 new Data() 24 { 25 names = new List<string> { "Carrot", "Tomato", "Cucumber" }, 26 prices = new List<int> { 100, 200, 300 } 27 }, 28 }; 29 30 foreach (var x in data) 31 { 32 foreach(var name in x.names) 33 { 34 Console.WriteLine($"name: { name }"); 35 } 36 37 foreach (var price in x.prices) 38 { 39 Console.WriteLine($"price: { price }"); 40 } 41 } 42 } 43 } 44} 45

実行結果

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 07:28

編集2016/05/17 07:31
aglkjggg

総合スコア769

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

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

退会済みユーザー

退会済みユーザー

2016/05/17 08:08

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問