Зависит от того, как и для чего именно вам нужен результат ...
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);
}
Здесь вы видите =>
лямбда-выражения . По сути, это выражение итератора, поэтому оно всегда означает, что вы «перебираете» или, если хотите, «перебираете» список / перечисление (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);
}