在键/值情况下保持集合对象(例如列表)的最佳方法是什么,其中键是 ID,值是 T 类型的集合?
这是唯一的选择还是.NET 3.5 中有更好的解决方案/另一个集合?
var x = new Dictionary<int, List<type>>();
在键/值情况下保持集合对象(例如列表)的最佳方法是什么,其中键是 ID,值是 T 类型的集合?
这是唯一的选择还是.NET 3.5 中有更好的解决方案/另一个集合?
var x = new Dictionary<int, List<type>>();
这是一个很好的解决方案,并且效果很好 - 您正在有效地使用 { key = int, value = 4 byte reference } 的字典对象。
当您通过键检索值时,您将取回List<T>
对堆上的引用并能够使用它。对于您的明显问题,这将是一个非常有效且紧凑的解决方案。
我不知道这是否是你需要的,但我会尽力而为。
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<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;
}
}
}
显然,您的需求可能会有所不同,您可能需要实现几个接口等,但这是一般的想法。
如果你的 ID 是你的类型的成员,你可以考虑实现一个System.Collections.ObjectModel.KeyedCollection<TKey, TItem>
您是否正在寻找一个多值字典,即一个键控集合,其中每个键可以有多个值?PowerCollections有这样一个 MultiDictionary。