2

在键/值情况下保持集合对象(例如列表)的最佳方法是什么,其中键是 ID,值是 T 类型的集合?

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

var x = new Dictionary<int, List<type>>();
4

6 回答 6

3

这是一个很好的解决方案,并且效果很好 - 您正在有效地使用 { key = int, value = 4 byte reference } 的字典对象。

当您通过键检索值时,您将取回List<T>对堆上的引用并能够使用它。对于您的明显问题,这将是一个非常有效且紧凑的解决方案。

于 2009-01-06T13:59:35.783 回答
0

我不知道这是否是你需要的,但我会尽力而为。

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>();
}

我不确定这是否会对您有所帮助,但它可能会帮助您改写您的问题。

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

于 2009-01-06T13:38:49.100 回答
0

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

于 2009-01-06T13:55:09.833 回答
0

我认为您可能应该根据需要编写包装类。我的意思是,如果您需要存储预制列表的字典,Dictionary<int, List<type>>只要它只是一个私有属性就可以了。您不应该公开公开它,因为显然它会公开太多信息,并且IDictionary<int, IList<T>>由于缺乏协方差,您不能将其转换为或类似的东西。

你最好的选择是这样的:

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;
       }
    }
}

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

于 2009-01-06T13:58:04.787 回答
0

如果你的 ID 是你的类型的成员,你可以考虑实现一个System.Collections.ObjectModel.KeyedCollection<TKey, TItem>

于 2009-01-06T14:10:55.980 回答
0

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

于 2009-01-06T14:31:31.820 回答