Нет больше «если / то»; Словарь использовать? - PullRequest
1 голос
/ 24 января 2009

Я пишу фрагмент кода, который для работы потребует большого количества операторов if / then. Чтобы устранить необходимость написания строки за строкой операторов if / then, могу ли я использовать словарь или список? Если это так, может кто-нибудь направить меня на хороший веб-ресурс или показать пример, где они делали это раньше?

Редактировать

Уточнение: у меня есть шесть входов, каждый из которых должен быть комбинированным с группой выборок. Ниже приведена подробная информация о входах и выборках.

(Ампер) 1: 1 - 1:12 (12 различных вариантов)

(Размер кабеля) 2: 1 - 2:13 (13 различных вариантов) Некоторые элементы в этом списке будут исключены при выборе первого входа.

(Тип кабеля) 3: 1 - 3: 2 (2 различных варианта)

(темп. Рейтинг) 4: 1 - 4: 3 (3 различных варианта)

(Тип системы) 5: 1 - 5: 2 (2 различных варианта)

(тип кабелепровода) 6: 1 - 6: 2 (2 различных варианта)

Из вышеприведенного ввода будут два выхода, которые появятся в двух текстовых полях.

(количество кабелей) 7: 1 - 7:16 (16 различных выходов)

(размер кабелепровода) 8: 1 - 8: 8 (8 разных выходов)

Надеюсь, это поможет, а не помешает.

Ответы [ 5 ]

2 голосов
/ 24 января 2009

Похоже, вы пытаетесь сопоставить каждую комбинацию из 6 входов (12 * 13 * 2 * 3 * 2 * 2 возможностей) с одним из (16 * 8) выходов. Если это так, вам все равно придется много печатать, но переход к коллекции позволит вам легко перенести отображение. Я думаю, что это лучше всего подходит для таблицы базы данных:

Amps | CableSize | CableType | TempRating | SystemType | ConduitType | CableQty | ConduitSize

Вы бы поставили первичный ключ на 6 входных столбцов, а затем просто сделали простой SELECT:

SELECT CableQty, ConduitSize 
FROM Table 
WHERE Amps = @amps AND CableSize = @cableSize...etc

Чтобы сделать это в быстром и грязном коде, будут работать массивы:

const int AMPS = 0; const int CABLE_SIZE = 1; const int TEMP_RATING = 2; // etc.
var mappings = new Dictionary<int[], int[]>(12 * 13 * 2 * 3 * 2 * 2);
mappings.Add(
   new int[] { 1, 1, 1, 1, 1, 1 }, // inputs
   new int[] { 1, 2 } //outputs
);
// repeat...a lot

var outputs = mappings.First(inputs => {
   inputs[AMPS] == myAmps
   && inputs[CABLE_SIZE] == myCableSize
   && inputs[TEMP_RATING] == myTempRating
   && // etc
});

Это не экономит много времени на вводе - хотя вы можете использовать циклы и тому подобное для заполнения отображений, если есть какая-то логика, - но это чертовски намного более читабельно, чем 6 страниц операторов if Я бы, вероятно, отключил регион или частично загрузил бы сопоставления).

2 голосов
/ 24 января 2009

Я действительно предлагаю построить объектную модель для хранения ваших настроек. Это даст вам возможность инкапсулировать вашу логику в отношении того, какие варианты доступны в какое время. Другое преимущество заключается в том, что ваш элемент управления Amp [1] может связываться с вашим SettingsContainer.Amp [1] .Value или каким-либо другим способом.

2 голосов
/ 24 января 2009

может захотеть дать представление о том, что вы делаете с операторами if /. Если вы просто получаете значение из ключа, то да, словарь, вероятно, будет работать.

Dictionary<string,string> map = new Dictionary<string,string>();

... populate the map with keys...

Тогда используйте это ...

string value = "default value";
if (map.ContainsKey(key))
{
   value = map[key];
}
1 голос
/ 24 января 2009

Поиск по словарю возможен, но я не верю, что это возможно с проблемой, которую вы описали.

Дэвид Томас Гарсия дал хорошее решение вашей проблемы. Мне нравится это решение, потому что оно обеспечивает хорошую инкапсуляцию в бизнес-объекте, которую вы, возможно, сможете использовать повторно, и я ожидаю, что оно также упростит обслуживание / отладку для вас.

Пусть объектная модель предоставляет списки по умолчанию для каждого списка вариантов, а затем при выборе каждого из них автоматически фильтруются нижние уровни вариантов выбора.

1 голос
/ 24 января 2009

Если вы всегда просто получаете простой поиск по значению ключа, тогда да, поиск по словарю может заменить длинную строку операторов if-then. Однако, если иногда ваша логика более сложна, чем простой поиск по значению ключа, вам, возможно, придется создать гибрид операторов if-then плюс поиск в словаре. Иногда они объединяются в одно логическое утверждение.

Единственный правильный ответ в вашем случае - точно следовать тому, что диктует ваш бизнес-домен. Если вы можете упростить поиск в словаре большую часть времени, используйте их. Не будьте слишком жесткими, чтобы выбирать одно из другого. Обычно бизнес-логика слишком запутана, чтобы аккуратно встать на место.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...