C#字典每个键可以有多个值

6
我正在使用一个 C# 字典。
Dictionary<int, string> d = new Dictionary<int, string>();

我使用字典,因为这样可以保证键值唯一,并且字典会强制执行。

键值将是整数。以前我只需要一个值,现在情况已经扩展到需要为相同的键存储多个值(具有不同的数据类型)。

类似于这样的内容 - (尽管它不起作用):

Dictionary<int,string,string,bool, bool,int,bool> d = new Dictionary<int, string,string,bool, bool,int,bool>();

请注意,我喜欢存储字符串、布尔值、整数和布尔值等附加值作为键字段,该字段将是一个整数。
我不确定如何做到这一点。如何获取一个键值来存储具有不同数据类型的多个值。我认为可能的一种方式是将附加字段存储到列表中,但不确定它们如何结合在一起。如果有人能提供示例,那将不胜感激。
提前感谢您。
4个回答

21

创建一个自定义数据类型,它具有字段 string, string, bool, bool, int, bool 并将其用作您的 Dictionary 值:

class MyType
{
    public string SomeVal1{ get; set; }
    public string SomeVal2{ get; set; }
    public bool SomeVal3{ get; set; }
    public bool SomeVal4{ get; set; }
    public int SomeVal5{ get; set; }
    public bool SomeVal6{ get; set; }
}

那么

var someDictionary = new Dictionary<int, MyType>();

并且

someDictionary.Add( 0, 
                    new MyType{
                        SomeVal1 = "foo",
                        SomeVal2 = "bar",
                        SomeVal3 = true,
                        SomeVal4 = false,
                        SomeVal5 = 42,
                        SomeVal6 = true
                    });

//someDictionary[0].SomeVal2 // bar

13
您可以使用Tuple作为值的泛型类型。
var d = new Dictionary<int,Tuple<string,string,bool, bool,int,bool>>();

或者创建一个类型(类或结构体),将不同的类型作为一组保存 - 很有可能这是更好的建模方式。


+1 只是因为这很性感,而且我以前从未见过。 - Matthew Cox
9
我建议不要使用元组,因为虽然您会得到强类型,但您无法了解值的含义。在这种情况下,我建议将封装类的建议从备选方案提升为主要答案,就像@spender所做的那样。 - Anthony Pegram
我同意@AnthonyPegram的观点,请不要使用元组。在我看来,元组只是开发人员懒惰的表现。类具有类型安全和上下文清晰的特点。 - Neil

0
在所有这些极客说的话中,我唯一可以补充的是,我认为你应该将那个字典封装成某个类,这样字典包装器的用户就永远不会知道引擎盖下面发生了什么,并且在那个类内部实现你首选的恢复逻辑或者这里列出的任意一种。

我建议使用结构体而不是类,因为它不包含任何方法,因此更适合使用值类型而不是引用类型。引用类型位于堆上,需要垃圾回收来释放内存,这会增加额外的开销。我肯定不会使用元组。事实上,我认为使用元组和使用var命名类型一样糟糕。 - Antony Booth

0

字典是“键/值”对。其中一个键对应一个值。该值可以是任何对象,因此您可以简单地创建一个包含所有所需成员的对象。请考虑以下内容:

var d = new Dictionary<int, string, string, bool, bool, int, bool>();

这个字典的使用者不会知道这些原始类型数据的意图。你应该创建一个对象:

public class Person : IPerson
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public bool IsMarried { get; set; }
    public bool HasChildren { get; set; }        
    public bool IsHappy { get; set; }

    public Person(int id)
    {
        Id = id;
    }
}

显然,这个对象完全是为了匹配类型和表示容器中的数据而创建的。有了这个理解,你可以做以下操作:

var d = new Dictionary<int, IPerson>();

但是如果你有一个Dictionary<Int64,List<Int64>>呢?你如何从这种类型的数据结构中获取值? - Su Llewellyn
这些值可以通过它们的键进行访问,例如如果你有这种类型的字典,并且有一个键为7L - 相应的Int64值列表可以在dictionaryInstance[7L]中找到。 - David Pine
我现在已经让它工作了,我应该编辑我的问题或者代码吗? - Su Llewellyn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接