不再“如果/那么”;字典使用?

时间:2009-01-24 05:00:06

标签: c# dictionary

我正在编写一段代码,需要大量的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种不同的选择)

从上面输入的两个输出将出现在两个文本框中。

(Cable Qty)7:1 - 7:16(16种不同的输出)

(导管尺寸)8:1 - 8:8(8种不同的输出)

我希望这有助于而不是阻碍。

5 个答案:

答案 0 :(得分:2)

可能想知道你对if / the语句做了些什么。如果您只是从密钥中获取值,那么,是的,字典可能会起作用。

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 :(得分:2)

我实际上建议构建一个对象模型来存储您的设置。这将使您有机会在适当的时间封装有关可用选项的逻辑。另一个好处是你的Amp [1]控件可以绑定到你的SettingsContainer.Amp [1] .Value,或者它最终会结束。

答案 2 :(得分:2)

看起来您正在尝试将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
});

它不会为你节省太多的输入 - 虽然你可以使用for循环等来填充映射,如果它有某种逻辑 - 但它比6页的if语句更具可读性(我可能会关闭或部分类加载映射。

答案 3 :(得分:1)

如果你总是只是获得一个简单的键值查找,那么字典查找可以替换一长串if-then语句。但是,如果有时您的逻辑比简单的键值查找更复杂,则可能必须创建if-then语句和字典查找的混合。有时这些将合并为一个逻辑陈述。

在您的情况下,唯一正确的答案是准确遵循您的业务领域所指示的内容。如果您可以在大多数情况下简化字典查找,那么请使用它们。但是,不要过于拘泥于选择其中一个。通常,业务逻辑太乱了,不能整齐地落到那样的地方。

答案 4 :(得分:1)

字典查找是可能的,但我不相信你所描述的问题是可行的。

David Thomas Garcia为您的问题提供了一个很好的解决方案。我喜欢这个解决方案,因为它在业务对象中提供了一个很好的封装,你可以重用它,我希望它也可以简化你的维护/调试。

让对象模型为每个选项列表公开默认列表,然后在选择每个选项时,选择较低级别的选项会自动过滤。