在键/值情况下保留集合对象(示例中为List)的最佳方法是什么,其中键是ID,值是T类型的集合?

这是唯一的选择还是在.NET 3.5中有更好的解决方案/另一个集合?

var x = new Dictionary<int, List<type>>();
有帮助吗?

解决方案

这是一个很好的解决方案,并且可以很好地工作 - 您实际上正在使用{key = int,value = 4 byte reference}的字典对象。

当您通过密钥检索值时,您将返回对堆上的 List&lt; T&gt; 的引用,并能够使用它。对于您明显的问题,这将是一个非常有效和紧凑的解决方案。

其他提示

我不知道这是否是你所需要的,但我会斩首。

public Dictionary<int,List<T>> myFunction<T>()
{
    var returnvalue = new Dictionary<int,List<T>>();
    //Do some stuff with the collection.
    return returnvalue;
}

然后你可以打电话

public void Main()
{
  var functionreturn = myFunction<String>();
}

我不确定这是否会对您有所帮助,但它可能会帮助您重新提出问题。

注意:以上是空气编码,未经测试。

我认为框架内没有任何内容,但我认为PowerCollections库中有一个MultiDictionary集合。你可以试试。

我认为您应该根据自己的需要编写包装类。我的意思是,如果你需要存储预制列表的字典, Dictionary&lt; int,List&lt; type&gt;&gt; 应该没问题,只要它只是一个私有属性。你不应该公开公开它,因为很明显它暴露了太多的信息,你不能把它投射到 IDictionary&lt; int,IList&lt; T&gt;&gt; 或类似的东西,因为缺乏协方差。

你最好的选择是这样的:

class MyWrapper<T>()
{
    private Dictionary<int, List<T>> dictionary { get; set; }
    public MyWrapper() { dictionary = new Dictionary<int, List<T>>(); }

    // Adds a new item to the collection
    public void Add(int key, T item)
    {
       List<T> list = null;
       if (!dictionary.TryGetValue(key, out list))
       {
          // If dictionary does not contain the key, we need to create a new list
          list = new List<T>();
          dictionary.Add(key, list);
       }
       list.Add(item);
    }

    public IEnumerable<T> this[int key]     
    {
       get
       {
           List<T> list = null;
           // We just return an empty list if the key is not found
           if (!dictionary.TryGetValue(key, out list)) return new List<T>();
           else return list;
       }
    }
}

显然,您的需求可能不同,您可能需要实现几个接口等,但这是一般的想法。

如果您的ID是您的类型的成员,您可以考虑实施 System.Collections.ObjectModel.KeyedCollection&lt; TKey,TItem&gt;

您是否正在寻找一个多值字典,即一个键控集合,其中每个键可以有多个值? PowerCollections 有这样一个MultiDictionary。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top