【发布时间】:2018-04-19 04:55:20
【问题描述】:
好的,可以使用普通字典执行此操作,但是我的字典/要存储的内容的大小不断变化,所以我想使用一个列表。这是我存储的内容:
public List<KeyValuePair<GameObject, float>> planesFilled;
我必须不断更新这些值(如果它们产生并且不存在于我的更新函数的列表中,则添加对。我正在存储对象与场景中另一个对象之间的距离。
我遇到了与无法调用Contains 相关的错误——我不一定知道过去的值。我的钥匙应该是游戏对象。
到目前为止我所拥有的:
foreach(GameObject plane in anchorManager.planesSpawned)
{
if (ContainsKeyValue(planesFilled.ToDictionary(), plane)) { //dont know value
} else {
planesFilled.Add (new KeyValuePair<GameObject, float>(plane, GetDistanceBetweenObjs(plane.transform, botController.transform)));
}
//planesFilled[plane] = new KeyValuePair<GameObject, float>(plane, GetDistanceBetweenObjs(plane.transform, botController.transform));
//list.Add(new KeyValuePair<double,double>(p.Key,p.Value));
planesFilled.Sort((pair1,pair2) => pair1.Value.CompareTo(pair2.Value));
}
此函数已启动,但在我的场景中并不完全有效:
public bool ContainsKeyValue<TKey, TVal>(Dictionary<TKey, TVal> dictionnaire,
TKey expectedKey,
TVal expectedValue) where TVal : IComparable
{
TVal actualValue;
if (!dictionnaire.TryGetValue(expectedKey, out actualValue))
{
return false;
}
return actualValue.CompareTo(expectedValue) == 0;
}
如何更新现有对象的值或将新对象添加到我的列表字典情况?
【问题讨论】:
-
听起来你应该只使用
Dictionary。字典可以随时间改变大小。这些函数正在尝试创建已经作为Dictionary的一部分存在的函数,并且在循环中调用ToDictionary函数会真正影响您的性能。 -
您能否详细说明“但是我的字典/要存储的东西的大小在不断变化,所以我想使用一个列表”?可以在字典中添加和删除条目。
-
另外,你在一个循环中有
planesFilled.ToDictionary(),这听起来像是在创建一个新字典来检查是否存在一个键。这强烈表明您应该只使用某种字典 - 正如 James 所说,很可能是 SortedDictionary(或 SortedList,它实际上是一个排序字典,只是根据其实现命名)。跨度> -
Skyguy 如果要获取值,请使用
TryGetValue(key, out value)(因为您已经是),如果您只想检查密钥是否存在,请使用ContainsKey(key)。 -
@john 说了什么。您可能在
Dictionary上找到的其他有用的成员是Values,它只返回一个值序列,Keys它只返回一个键序列,以及ContainsValue(value),它可以让你检查一个值是否存在。请参阅msdn.microsoft.com/en-us/library/xfhwa508(v=vs.110).aspx 了解完整的成员列表。
标签: c# list sorting dictionary unity3d