9

我想使用一个通用集合Dictionary,但Dictionary要求每个键都是唯一的。我对同一个“键”有多个值,所以我需要一个允许这样做的通用集合。

我意识到这使得钥匙不再是真正的钥匙,但我不知道还能叫它什么。

4

6 回答 6

20

几个选项供您考虑:

  • use a —为每个键Dictionary<TKey, List<TValue>>保留一个值列表,而不是防止相同键的重复值(即重复对);
  • use a —为每个键Dictionary<TKey, HashSet<TValue>>保留一组值,防止同一键出现重复值
  • 使用 a List<KeyValuePair<TKey, TValue>>- 保留对列表,不防止相同键的重复值。

请注意,在后一种情况下KeyValuePair是 a struct,而不是 a class,因此这意味着处理方式有所不同。

正确的选择取决于您的实际用例。

于 2011-03-02T22:30:30.183 回答
8

在 .NET 3.5 及更高版本中,即ILookup<TKey,TValue>. 不幸的是,唯一提供的实现是不可变的Lookup<TKey,TValue>,但是它很容易重新实现。AnEditableLookup<TKey,TValue>包含在MiscUtil中。

使用 an ILookup<TKey,TValue>TKey索引器返回 an IEnumerable<TValue>(即使该键没有匹配项),因此典型用法是:

foreach(var value in lookup[key])
    DoSomethingWith(value);
于 2011-03-02T22:38:31.690 回答
4

在 C++ 中,这样的集合称为多重映射。对该术语的快速搜索揭示了这个相关问题:

.NET 中的多图

于 2011-03-02T22:29:48.403 回答
2

您可以自己创建Dictionary<TKey,List<TValue>>并进行手动工作,但默认情况下没有“多字典”集合。

也就是说,如果您有一个 IEnumerable,您可以将其转换为类似于您所描述的查找,但不能自行构造(必须调用 ToLookup() 才能从枚举创建)。

于 2011-03-02T22:28:36.843 回答
0

试试Dictionary<KeyType,List<ValueType>>

您可以创建一个自定义字典来包装此字典,以便在添加和删除时处理所有必需的逻辑。

于 2011-03-02T22:28:09.450 回答
0

为了您的价值,您可以存储您想要持有的任何内容的列表。

于 2011-03-02T22:28:44.707 回答