C#でdictionaryのvalueにkey毎に任意の型は使えますか?
受付中
回答 3
投稿
- 評価
- クリップ 1
- VIEW 9,918

退会済みユーザー
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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
+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 });
等があると思います。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
こんな感じでいかがでしょうか。
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
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
dictionaryをどのように処理していくかわからないので使えるかわかりませんが匿名型+配列の暗黙の型指定で以下のような書き方もできます。
var data = new
{
name = new [] { "Apple", "Orange", "Grape" },
price = new [] { 200, 300, 150 }
};
以下の記事も参考になるかと思います。
neue cc - C#でローカル変数からDictionaryを生成する
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.36%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2016/05/17 17:09
4種類もやり方を教えていただけるとは・・・!
非常に参考になります、2番目のDictionary<string, object>でキャストする方法を試してみようと思います!