C# 不再有“如果/那么”;字典的使用?
我正在写一段代码,它需要大量的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不同输出C# 不再有“如果/那么”;字典的使用?,c#,dictionary,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种不同选择 系统类型
我希望这能起到帮助而不是阻碍的作用。您可能想了解一下您对if/the语句所做的工作。如果您只是从一个键获取一个值,那么,是的,字典可能会起作用
Dictionary<string,string> map = new Dictionary<string,string>();
... populate the map with keys...
您可能想了解一下您正在使用if/the语句做什么。如果您只是从一个键获取一个值,那么,是的,字典可能会起作用
Dictionary<string,string> map = new Dictionary<string,string>();
... populate the map with keys...
如果您总是只是获得一个简单的键值查找,那么字典查找可以替换一个长字符串的If-then语句。但是,如果有时您的逻辑比简单的键值查找更复杂,那么您可能必须创建if-then语句和字典查找的混合。有时,这些将被组合成一个逻辑语句
在您的情况下,唯一正确的答案是严格遵循您的业务领域的要求。如果你可以在大部分时间简化字典查找,那么就使用它们。不过,不要太死板,不能选择其中一个。通常,业务逻辑太混乱,无法像那样整齐地排列到位。如果您总是只获得一个简单的键值查找,那么是的,字典查找可以替换一长串If-then语句。但是,如果有时您的逻辑比简单的键值查找更复杂,那么您可能必须创建if-then语句和字典查找的混合。有时,这些将被组合成一个逻辑语句
在您的情况下,唯一正确的答案是严格遵循您的业务领域的要求。如果你可以在大部分时间简化字典查找,那么就使用它们。不过,不要太死板,不能选择其中一个。通常,业务逻辑太混乱,无法像那样整齐地放在适当的位置。我实际上建议构建一个对象模型来存储您的设置。这将给你一个机会来封装你的逻辑,关于什么时候有什么选项可用。另一个好处是,您的Amp[1]控件可以绑定到您的设置Container.Amp[1].值,或者以任何方式结束。实际上,我建议您构建一个对象模型来存储您的设置。这将给你一个机会来封装你的逻辑,关于什么时候有什么选项可用。另一个好处是,您的Amp[1]控件可以绑定到您的设置container.Amp[1].值,或者以任何方式结束。可以进行字典查找,但我认为您描述的问题不可行 大卫·托马斯·加西亚为你的问题提供了一个很好的解决方案。我喜欢这个解决方案,因为它在业务对象中进行了很好的封装,您可以重用它,并且我希望它也能简化您的维护/调试
让对象模型为每个选项列表显示默认列表,然后在选择每个选项时,让较低级别的选项自动筛选。可以进行字典查找,但我认为您描述的问题不可行 大卫·托马斯·加西亚为你的问题提供了一个很好的解决方案。我喜欢这个解决方案,因为它在业务对象中进行了很好的封装,您可以重用它,并且我希望它也能简化您的维护/调试
让对象模型为每个选项列表显示默认列表,然后在选择每个选项时,自动筛选较低级别的选项。看起来您正在尝试将6个输入12*13*2*3*2*2的每个组合映射到16*8个输出中的一个。如果是这样的话,您仍然需要进行大量的键入工作,但是移动到集合将允许您轻松地将映射外部化。我想这可能最适合数据库表:
Amps | CableSize | CableType | TempRating | SystemType | ConduitType | CableQty | ConduitSize
在6个输入列上放置一个主键,然后只需执行一个简单的选择:
SELECT CableQty, ConduitSize
FROM Table
WHERE Amps = @amps AND CableSize = @cableSize...etc
要在快速脏代码中实现这一点,数组
uld工作:
它不会为您节省太多的输入—虽然如果有某种逻辑,您可以使用for循环之类的方法来填充映射—但它的可读性比我可能会分区或部分类加载映射的6页if语句要好得多。看起来您正试图映射6个输入的每个组合16*8输出之一的12*13*2*3*2*2可能性。如果是这样的话,您仍然需要进行大量的键入工作,但是移动到集合将允许您轻松地将映射外部化。我想这可能最适合数据库表:
Amps | CableSize | CableType | TempRating | SystemType | ConduitType | CableQty | ConduitSize
在6个输入列上放置一个主键,然后只需执行一个简单的选择:
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语句要高得多,我可能会对映射进行分区或部分类加载。您有没有一个我们可以使用的好例子?我会尝试;我只是希望我能把它写在有意义的地方。如果示例代码部分不起作用,那么就您试图解决的问题再详细一点怎么样?还没有代码,我还没有找到方向,对不起。我确实发布了一些附加信息;看下面。你有一个好的例子,我们可以一起工作吗?我会试试;我只是希望我能把它写在有意义的地方。如果示例代码部分不起作用,那么就您试图解决的问题再详细一点怎么样?还没有代码,我还没有找到方向,对不起。我确实发布了一些附加信息;请看下面。我已经为此创建了一个excel表格。您在excel中具体做什么?您是否在Excel中记录对象模型?或者使用Excel进行持久化?我已经为此创建了一个Excel工作表。您在Excel中具体做什么?您是否在Excel中记录对象模型?或者使用Excel进行持久化?数据库表;那是外部文件吗?我不会使用.mdb文件,是吗?是的,mdb可以解决这个问题。这可能会让非程序员,提出这些映射的人,在不改变代码的情况下改变映射。好的,我想我有一个明确的方向,这就是我想要的。我欢迎任何其他意见或建议。我将在尝试实现解决方案时更新此线程。谢谢。马克,你展示的数组,是多维数组吗?在过去的几天里,我对这个问题做了一些更深入的研究。我制作了一份excel电子表格,其中显示了数据库表中可能性的完整地图;那是外部文件吗?我不会使用.mdb文件,是吗?是的,mdb可以解决这个问题。这可能会让非程序员,提出这些映射的人,在不改变代码的情况下改变映射。好的,我想我有一个明确的方向,这就是我想要的。我欢迎任何其他意见或建议。我将在尝试实现解决方案时更新此线程。谢谢。马克,你展示的数组,是多维数组吗?在过去的几天里,我对这个问题做了一些更深入的研究。我制作了一份excel电子表格,显示了可能性的完整地图