Необходимо удалить и отсортировать ключевые числа и цветные элементы из словаря

У меня есть словарь вроде:

var map = new Dictionary<int, ColorType>();

где ColorType - это перечисление {Red, Yellow, White}

Он сочетается с массивом чисел, например:

var lstNumbers = Enumerable
            .Range(1, 100).OrderBy(n => Guid.NewGuid().GetHashCode())
            .ToArray();

Мне нужно сделать следующее:

  1. Удалите все четные числа, которые красные
  2. Удалите все желтые нечетные числа
  3. Удалите все белые числа делящиеся на 3.
  4. Sort list ascending based on number and then color (Red

Это эффективный способ сделать это?


person Justeasy StackAttacka    schedule 05.04.2018    source источник
comment
Есть ли какие-либо наблюдения о неэффективности вашего кода? Что не так, если работает?   -  person Eser    schedule 06.04.2018
comment
Я не понимаю, какое отношение lstNumbers к этому вопросу. Могут ли некоторые из этих операций применяться к как списку, так и словарю?   -  person mjwills    schedule 06.04.2018
comment
Вы не сможете добиться большей эффективности, чем метод сортировки, использованный на шаге 4. Сортировка - это хорошо известная эффективность, и нет никаких известных улучшений для самого быстрого подхода. Шаги 1-3 будут O (n) и, следовательно, не имеют отношения к эффективности процесса.   -  person Travis J    schedule 06.04.2018
comment
Я думал об этом, но не уверен, что это правильный подход. toRemove = lstNumbers.Array .Select (x = ›new KeyValuePair‹ int, ColorType ›((int) x.lstNumbers, x.ColorType)) .ToList ();   -  person Justeasy StackAttacka    schedule 06.04.2018


Ответы (1)


Для первых 3:

foreach(KeyValuePair<int, ColorType> entry in map.ToList()) {

    if (entry.Key % 2 == 0 && entry.Value == ColorType.Red) { // Even and Red
        map.Remove(entry.Key);
    }

    if (entry.Key % 2 == 1 && entry.Value == ColorType.Yellow) { // Odd and Yellow
        map.Remove(entry.Key);
    }

    if (entry.Key % 3 == 0 && entry.Value == ColorType.White) { // Divisible by 3 and White
        map.Remove(entry.Key);
    }
}

Что касается сортировки словаря, ответ можно найти здесь

person L.B    schedule 05.04.2018
comment
Вы не можете выполнять итерацию и изменять коллекцию одновременно. - person Ron Beyer; 06.04.2018
comment
Да плохо, не тестировал перед публикацией. Обновлено - person L.B; 06.04.2018
comment
Будет ли это map.ToArray (), поскольку я использую массив или это имеет значение? - person Justeasy StackAttacka; 06.04.2018
comment
Также я получаю исключение KeyNotFound на моем экране. foreach (число переменных в lstNumbers) Console.WriteLine ($ {число}, {карта [число]}); Console.ReadLine (); - person Justeasy StackAttacka; 06.04.2018
comment
Некоторые записи в словаре были удалены (в предыдущем цикле), поэтому, когда вы сделаете map[num] в списке чисел в lstNumbers, вы получите исключение KeyNotFound. - person L.B; 06.04.2018
comment
Я не уверен, почему мои комментарии не форматируются в формате кодового блока. Я уверен, что неправильно ввожу. Я просто пытался сделать отступ на 4 пробела, как вы делаете при публикации, но это не сработало. Все еще изучаю функции форума. - person Justeasy StackAttacka; 06.04.2018
comment
Вам нужно либо просмотреть словарь, чтобы напечатать значения, либо проверить, существует ли значение в словаре перед печатью. - person L.B; 06.04.2018
comment
@JusteasyStackAttacka В комментариях заключайте блоки кода в обратную кавычку (` ). - person Rufus L; 06.04.2018
comment
@Rufus, как ни странно, подписи к комментариям проинформировали меня о форматировании mini-Markdown сразу после запроса. lol Но в любом случае спасибо! - person Justeasy StackAttacka; 06.04.2018
comment
@ L.B. Спасибо за вашу помощь. Это уже давно ломало мне голову! @Rufus Это правильный шрифт и для моих ценностей. Спасибо! - person Justeasy StackAttacka; 06.04.2018
comment
Я нашел хороший метод сортировки, но затем понял, что у меня нет конкретных деталей того, что нужно сортировать. Пока у меня есть: 'List ‹KeyValuePair‹ int, ColorType ›› myList = map.ToList (); myList.Sort (делегат (KeyValuePair ‹int, ColorType› pair1, KeyValuePair ‹int, ColorType› pair2) {return pair1.Value.CompareTo (pair2.Value);}); ' Мне нужно отсортировать по: 1: Сортировка номеров списка по возрастанию и по цвету Красный ‹Желтый‹ Белый Как я могу применить эти спецификации? - person Justeasy StackAttacka; 06.04.2018
comment
Would it be map.ToArray() since I'm using an array or does it matter? ToArray немного медленнее, чем ToList @JusteasyStackAttacka. - person mjwills; 06.04.2018