【问题标题】:Multiple list or dictionary?多个列表或字典?
【发布时间】:2019-05-11 13:55:39
【问题描述】:

我在 Unity3D 中使用 C# 工作。我需要一个结构来保存一些值。我需要通过字符串索引访问该结构,并且值是 GameObjects(但这个问题适用于任何可能的值,它是相同的)。我不知道我将在每个索引上存储多少个对象,所以它不能是一个数组。 我想在一个

Dictionary<string,List<GameObject>>

但是可以在我添加索引的同时将项目添加到该列表中吗?因为如果我需要在将其添加到字典之前填写列表,我可以拥有 X 个列表而忘记字典。

实现这一点的最佳结构是什么?

【问题讨论】:

  • if(dictionary.ContainsKey("MyKey")) { // Update the existing list }else{ // Insert new key with new value }
  • 即字典在每个索引上都有 1 个元素。我想在每个索引上都有一个列表。所以我必须将它添加到列表中,而不是字典中。
  • 没有。你刚才说的是字典是如何工作的。我从来没有说过没有在每个索引上都有一个列表。通过将元素添加到字典中特定键的列表来更新字典有什么问题?
  • 您在这里的思路完全正确。您可以在将项目添加到字典之前或之后将项目添加到 List,它是对 List 的引用,因此它将完全按照您的预期工作。
  • 使用 Linq : Dictionary> dict = objects.GroupBy(x => x.index, y => y) .​​ToDictionary(x => x.Key, y = > y.ToList());

标签: c# arrays list dictionary


【解决方案1】:

您可以实现自己的多字典

public class MultiDictionary<TKey, TValue> : Dictionary<TKey, List<TValue>>
{
    public void Add(TKey key, TValue value)
    {
        if (TryGetValue(key, out List<TValue> valueList)) {
            valueList.Add(value);
        } else {
            Add(key, new List<TValue> { value });
        }
    }
}

请注意,我添加了一个Add 方法,以便能够自动添加单个值而无需处理列表。该类继承了原始的Add 方法,该方法还允许您添加整个列表。

如果您需要添加唯一值并且顺序无关紧要,您也可以创建一个Dictionary&lt;TKey, HashSet&lt;TValue&gt;&gt;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    • 2019-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    相关资源
    最近更新 更多