Есть ли способ изменить несколько значений словаря одновременно в C#? - PullRequest
1 голос
/ 29 января 2020

У меня есть класс со свойством Dictionary, содержащим длинный список логических значений, которые по умолчанию имеют значение false в конструкторе. После создания объекта мне нужно изменить некоторое их количество на true в зависимости от других факторов, мой вопрос: есть ли более эффективный способ изменить несколько значений на true, чем список присвоений значений?

РЕДАКТИРОВАТЬ: Я помогаю студенту создать игру, у него есть объект комнаты, и в каждой комнате есть 8 возможных выходов. Он хочет определить выходы каждой комнаты индивидуально, как он думает, что они должны быть. Он решил сделать его словарём, а затем определял словарь с 8 значениями true / false в каждом конструкторе Room. Я предложил начать со словаря всех ложных понятий и заменить только те, которые ему нужны, чтобы быть правдой (небольшой процент от большинства). Поскольку нет шаблонных циклов и функции не работают для того, что он пытается сделать, ему нужно ввести его вручную, но я искал способ DRY его кода.

Dictionary<int, bool> dict = new Dictionary<int, bool>()
{
    {1, false},
    {2, false},
    {3, false},
    {4, false},
    {5, false},
    {6, false},
    {7, false},
    {8, false}
};

myObject1.dict[1] = true;
myObject1.dict[3] = true;
myObject1.dict[4] = true;
myObject2.dict[3] = true;
myObject3.dict[1] = true;
myObject3.dict[5] = true;
...

Ответы [ 3 ]

1 голос
/ 29 января 2020

Вы можете написать такой метод:

void SetMultipleKeyValues(Dictionary<int,bool> dictionary, bool value, params int[] keys)
{
  foreach(int key in keys) 
  {
    dictionary[key] = value;
  }
}

Это упрощенный пример c, вы можете сделать его обобщенным c методом расширения, используя LINQ вместо foreach l oop, et c. Это хорошо инкапсулирует цикл, так что вы не будете тиражировать его везде, где вам нужно установить список значений в словаре.

Джефф

1 голос
/ 30 января 2020

Я сомневаюсь, что есть более эффективный способ, но есть более «компактный», без циклического перебора всех ключей каждого словаря:

var dict = new Dictionary<int, bool>()
{
    {1, false},
    {2, false},
    {3, false},
    {4, false},
    {5, false},
    {6, false}
};

new List<int> { 1, 3, 4 }.ForEach(i => myObject1.dict[i] = true);
new List<int> { 3       }.ForEach(i => myObject2.dict[i] = true);
new List<int> { 1, 5    }.ForEach(i => myObject3.dict[i] = true);
1 голос
/ 29 января 2020

Вы можете использовать Linq для обновления нескольких записей в словаре на основании условия.

В следующем примере просто изменяются значения каждого четного ключа. Вы можете использовать свое собственное условие в предложении «Где», чтобы получить указанные c ключи, которые необходимо обновить.

dict.Where(x => x.Key % 2 == 0).ToList().ForEach(x => dict[x.Key] = true);

Произвольно выбрать двери

Вы может также работать, где вы обновляете словарь на основе определенных случайных чисел.

int numOfDoors = 4;
List<int> randomNumber = Enumerable.Range(0, numOfDoors).Select(x => new Random().Next(1, dict.Count())).ToList();
dict.Where(x => randomNumber.Contains(x.Key)).ToList().ForEach(x => dict[x.Key] = true);
...