键是一个游戏对象,在玩游戏时应根据与包含该列表的游戏对象之间的距离主动对列表进行排序。
该值是一个枚举,可以在游戏过程中更改;因此,它不能是只读的。
我一直在搞乱Dictionary,SortedList和keyvaluepairs列表,但是由于各种原因,我每次都遇到问题。
那么,哪个容器适合我要做什么?
键是一个游戏对象,在玩游戏时应根据与包含该列表的游戏对象之间的距离主动对列表进行排序。
该值是一个枚举,可以在游戏过程中更改;因此,它不能是只读的。
我一直在搞乱Dictionary,SortedList和keyvaluepairs列表,但是由于各种原因,我每次都遇到问题。
那么,哪个容器适合我要做什么?
这取决于您究竟需要什么方式以及需要什么...
Dictionary<Tkey,TValue>
实现了IEnumrable<KeyValuePair<TKey,TValue>>
,因此您可以例如使用Linq OrderByDescending
(或者根据您的需要使用OrderBy
)和Select
using System.Linq;
...
Dictionary<GameObject,SomeEnum> GameObjectToValue = new Dictionary<GameObject,SomeEnum>();
private List<SomeEnum> GetDecendingValues()
{
return
// this first query returns an IEnumerable<KeyValuePair<GameObject,SomeEnum>>
// which is sorted descending by the distance (furthest = first element,closest = last)
// from the THE_VECTOR_TO_COMOPARE_TO
GameObjectToValue.OrderByDescending(kvp => Vector3.Distance(kvp.Key.transform.position,THE_VECTOR_TO_COMOPARE_TO)
// In this second step you say you only want the values as IEnumerable<SomeEnum>
.Select(kvp => kvp.Value)
// And finaly you convert it again to a list (if needed)
.ToList();
}
或者如果您仍然希望将其用作排序字典,则更改很小:
private Dictionary<GameObject,SomeEnum> GetDecendingDictionary()
{
return
// the sorting stays the same
GameObjectToValue.OrderByDescending(kvp => Vector3.Distance(kvp.Key.transform.position,THE_VECTOR_TO_COMOPARE_TO)
// convert the IEnumerable<KeyValuePair<GameObject,SomeEnum>>
// back to a dictionary
.ToDictionary(kvp => kvp.Key,kvp => kvp.Value);
}
您在这里看到的是=>
lambda expressions。基本上,这是一个迭代器表达式,因此它始终表示您“迭代”或如果您希望“遍历”列表/枚举(IEnumerable
)。
例如
.Select(kvp => kvp.Value)
在引擎盖下的意思类似于
// Ofcourse it uses an IEnumerable not a List but this
// is just for better understanding where the kvp variable comes from
var list = new List<SomeEnum>();
foreach(var kvp in theSortedeyValuePairEnumerable)
{
list.Add(kvp.Value);
}