C#字典每个键有两个值?

49

我在代码中遇到一个情况,Dictionary<string, string> 似乎是最好的选择 - 我需要一组对象,并需要通过唯一键访问它们。这正是字典的概念所用之处,对吧?

但是,需求已经扩展到需要每个键保存附加信息(一个布尔值,如果你好奇的话)。

所以,我想扩展这个概念,创建一个新的数据结构,包含字符串和布尔值,并使其成为 Dictionary<string, NewCustomObject>

然而,仅仅为了一个布尔标志这样做感觉过于复杂。但我不知道有哪些类似于字典的泛型对象可以在每个键上拥有两个值。

是否只使用自定义对象的字典是解决此问题的最佳方法,还是有更简单的方案适用于这种情景?


多值字典文章可能满足您的需求。 - Anax
18
你的第一个想法使用 Dictionary<string, NewCustomObject> 绝不会过度设计。它精确地表达了意图,类型安全,启用智能感知功能,可以轻松适应下一个需求变更。 - Oren Trutner
2
@Oren Trutner:完全同意。 @Schnapple:不要使用Pair,而是使用自定义的对象,并为其命名规范。例如,避免使用类似“Value1”和“Value2”这样的字段名称,给它们赋予语义化的含义。 - Randolpho
1
在面向对象的编程语言中创建新类时,通常不存在所谓的“过度设计”。在这种情况下也是如此。 - Ed S.
可能重复的问题:多值字典 - nawfal
我知道这是一个老问题,但在现代的C#中,你也可以使用命名元组 - Hamid Mayeli
10个回答

38

实际上,您刚才所描述的情况是使用字典集合的理想情况。它应该包含键值对,无论值的类型如何。通过将值作为其自己的类,将来如果需要,您可以轻松地进行扩展。


我最终选择了这条路,因为其他方法看起来同样复杂,并且它是在.NET 3.5中,所以对我来说没有元组。 - Tom Kidd

20
class MappedValue
{
    public string SomeString { get; set; }
    public bool SomeBool { get; set; }
}

Dictionary<string, MappedValue> myList = new Dictionary<string, MappedValue>;

9

我认为你正在涉及元组的概念 - 例如 Tuple<x, y, z>Tuple<string, bool, value>

C# 4.0将支持元组的动态支持,但除此之外,您需要自己编写或下载一个元组库。

您可以在这里查看我的答案,其中我放置了一些通用元组类的示例代码。或者我可以在这里重新发布它:

public class Tuple<T, T2, T3>
{
    public Tuple(T first, T2 second, T3 third)

    {
        First = first;
        Second = second;
        Third = third;
    }

    public T First { get; set; }
    public T2 Second { get; set; }
    public T3 Third { get; set; }

}

7
在.NET4中,您可以使用(unchecked):Dictionary<string, Tuple<bool,string>>

3

我认为 .net 没有内置 Multi-Map,它通常是一种数据结构,可用于进行这种类型的存储。另一方面,我认为只使用一个包含字符串和布尔值的自定义对象并不过度。


多重映射允许您针对给定键存储多个值,但这些值都是相同的类型,并且在其他方面没有区别,因此不适合这种需求。 - Daniel Earwicker

1

这个对你不起作用吗?

Dictionary<string, List<string>>

或者您可以使用元组,并拥有一个该元组的字典:

Dictionary<string, Tuple<string, bool>>

那么他如何使用这个存储布尔值呢? - Ralph Caraveo
或者等价地说,System.Collections.Specialized.NameValueCollection - Steve Guidi
1
Ralph:我最初回答了这个问题的标题。为那种情况添加了一个解决方案。 - Mehrdad Afshari
Steve:NameValueCollection不是哈希表。它执行O(n)搜索。 - Mehrdad Afshari

0

字典只是一个对象的键集合。因此,它可以容纳任何类型的对象。即使是最简单的对象,比如说一个数组(它派生自Object),但需要更少的代码。

与其编写整个类,不如将动态分配的数组或列表放入值中并运行。

字典在这方面非常灵活。


0

关于Lookup类怎么样?

编辑:

仔细阅读问题后,认为这不是最好的解决方案,但对于具有单个键的一些值的字典仍然是一个不错的选择。


0
另一个想法是将布尔值存储在单独的数据结构中,例如 HashSet。

0

元组始终是一个不错的解决方案。此外,在面向对象的方法中,始终优先使用组合而非继承。构建一个组合对象来进行分组。简单明了。我认为你可以从其他stackoverflow用户那里得到一些漂亮且干净的解决方案。 :)


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