我想在C#中创建一个Dictionary查找表.我需要将一个3元组的值解析为一个字符串.我尝试使用数组作为键,但这不起作用,我不知道还能做什么.在这一点上,我正在考虑制作一本词典字典词典,但这看起来可能不是很漂亮,尽管我会在javascript中这样做.
我如何在c#中创建一个多值字典?
例如Dictionary<T,T,T>,第一个T是键,其他两个是值.
所以这是可能的: Dictionary<int,object,double>
谢谢
我一直在寻找一种方法来存储和检索超过C#的通用Dictionary类提供的单个键的值.
在网上搜索(以及SO本身)向我展示了几个选项:
基于元组的词典
.NET 4.0可以轻松支持通用的Tuple <,>类.这意味着您可以使用任意元组创建一个Dictionary,即
var myDict = new Dictionary<Tuple<Char, Int>, MyClass>();嵌套字典
我了解到你也可以在Dictionaries中嵌套Dictionaries,这使得访问存储的结果类似于访问N维数组.例如:
Dictionary<int, Dictionary<int, Dictionary<Char, MyClass>>>
Run Code Online (Sandbox Code Playgroud)
然后可以通过以下方式获得: MyClass foo = MyData[8][3]['W'];
定界连锁键词典
但是,虽然两者都适用于复杂数据和自定义类,但我想知道它们是否总是必要的.至少对于原始数据,看起来将键与分隔符连接起来同样有效.
//keys are char + int
Dictionary<string, MyClass> myDict = New Dictionary<string, Myclass>();
String input = myChar + "|" + myInt
MyClass foo = myDict[input]
Run Code Online (Sandbox Code Playgroud)
是否存在使这些方法中的一种优于另一种方案的情景?他们会有类似的表演时间吗?或者重点应该放在哪种方法提供最干净,最容易维护的代码上?
思考?
SO上也有类似的问题,但没有一个回答我的问题。
我想要一个二维词典来翻译。像这样的东西:
Dictionary["DE"][TranslationKeys.Title] = "Title in German";
Dictionary["DE"][TranslationKeys.SubTitle] = "Subtitle in German";
Dictionary["PL"][TranslationKeys.Title] = "Title in Polish";
Dictionary["PL"][TranslationKeys.SubTitle] = "Subtitle in Polish";
Dictionary["EN"][TranslationKeys.Title] = "Title in English";
Dictionary["EN"][TranslationKeys.SubTitle] = "Subtitle in English";
Run Code Online (Sandbox Code Playgroud)
如果我使用传统字典就好了Dictionary<string,Dictionary<TranslationKeys,string>>
但我不想以这样的“丑陋”方式初始化它:
Dictionary = new Dictionary<string,Dictionary<TranslationKeys,string>>(){
{"PL",new Dictionary<TranslationKeys,string>(){{TranslationKeys.SubTitle,"Subtitle in Polish"}}}
};
Run Code Online (Sandbox Code Playgroud)
但像这样:
Dictionary["PL"][TranslationKeys.SubTitle] = "Subtitle in Polish";
Run Code Online (Sandbox Code Playgroud)
所以我尝试实现一个“智能”多维字典,如果他得到了值,它就会自行计算出来。到目前为止我所做的是一个使用 Dictionary 和特殊索引器的新通用类:
public class TranslateDictionary<TKey, TValue> where TValue : new()
{
private Dictionary<TKey, TValue> Dictionary;
public TValue this[TKey lang]
{
get
{
if (!Dictionary.ContainsKey(lang))
{
TValue obj …Run Code Online (Sandbox Code Playgroud)