C # - Работа со значениями в словаре - PullRequest
0 голосов
/ 14 января 2011

Это может быть простой вопрос, но я не могу найти простой способ сделать это.В настоящее время у меня есть простой словарь с KeyValuePairs, например:

<1, 100> <2, 200> <3, -999> <4, 134> <5, -999> <6, 223> <7, 123>

Значение (-999) является индикатором возникновения ошибки.То, что я пытаюсь сделать, это перебирать словарь, и для каждого случая, когда -999, использовать значение для следующего ключа.Результат, приведенный выше, будет следующим:

<1, 100> <2, 200> <3, 134> <4, 134> <5, 223> <6, 223><7, 123>

Будем благодарны за любые мысли!

Ответы [ 4 ]

4 голосов
/ 14 января 2011

Вы должны предположить, что ваши ключи имеют порядок (это необходимо, потому что словари в противном случае не имеют порядок). Вы можете рассмотреть возможность использования SortedDictionary.

В любом случае, вы можете сказать:

var keys = dictionary.Keys.OrderByDescending(k => k);
int current = -999;
foreach (var key in keys) {
    if (dictionary[key] == -999) {
        dictionary[key] = current;
    }
    current = dictionary[key];
}

Обратите внимание, что вы не указали, что делать, если "последний" элемент - -999. На данный момент он остается на уровне -999.

1 голос
/ 14 января 2011

Есть ли у вас доступ к n + 1-му элементу при добавлении n-го элемента?Если это так, вы можете заменить n + 1-е значение при добавлении n-го ключа.

Если нет, то вам нужна упорядоченная коллекция.Я не уверен, что вам нужен SortedDictionary, потому что ключи могут не соответствовать вашему порядку сортировки?Также удивительно, что вы перечисляете несколько пар K, V с одинаковыми ключами.Словарям это не понравится.

Ключ в V?Как ID собственности?Если это так, вы можете попытаться получить класс из KeyedCollection, который сохраняет порядок, в котором вы добавили элементы, и позволяет вам решить, какое свойство значения является ключом, если оно работает таким образом для вас.Но опять же, нет дубликатов ключей.

0 голосов
/ 14 января 2011

Если они вам не нужны в словаре, вы можете использовать связанный список, тогда вы можете начать с конца и пройтись по списку, чтобы обновить значения -999.

LinkedList<KeyValuePair<int, int>> myList = GetMyKeyValues();

LinkedListNode<KeyValuePair<int, int>> curr = myList.Last;
LinkedListNode<KeyValuePair<int, int>> last = null;

while (curr != null)
{
    if (curr.Value == -999 && last != null)
    {
        curr.Value = last.Value;
    }

    last = curr;
    curr = curr.Previous;
}
0 голосов
/ 14 января 2011

Я собираюсь предположить, что вы хотите обработать значения в порядке их добавления в словарь, а не в порядке, в котором они могут быть отсортированы. Я думаю, вам лучше использовать Stack <>. Таким образом, вы можете поместить все пары ключей в стек, а затем вытолкнуть их назад. Когда вы найдете -999, вы можете применить значение предыдущей KeyValuePair, которая была извлечена из стека, и двигаться дальше.

...