Какой контейнер для KeyValuePair, отсортированный по расстоянию ключей до другого преобразования, и позволяющий изменить значение во время выполнения? - PullRequest
0 голосов
/ 04 ноября 2019

Ключ - игровой объект, и список должен активно сортироваться во время игры в зависимости от расстояния до игрового объекта, который содержит список.

Значение - это enum, которое можно изменить во время игры;поэтому он не может быть доступен только для чтения.

Я возился с Dictionary, SortedList и списком KeyValuePairs, но продолжаю сталкиваться с проблемами по каждой из них по разным причинам.

Итак,какой контейнер соответствует тому, что я пытаюсь сделать?

1 Ответ

0 голосов
/ 04 ноября 2019

Зависит от того, как и для чего именно вам нужен результат ...

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...