C# 如何执行除基于某些条件的语句外的所有语句?
假设我有一个方法,其中有多个语句,当方法调用一个以外的语句时将执行这些语句。(将根据传递给方法的参数确定一条不执行的语句) 如何实现上述场景 到目前为止我所做的事情 我有以下方法C# 如何执行除基于某些条件的语句外的所有语句?,c#,if-statement,conditional-statements,C#,If Statement,Conditional Statements,假设我有一个方法,其中有多个语句,当方法调用一个以外的语句时将执行这些语句。(将根据传递给方法的参数确定一条不执行的语句) 如何实现上述场景 到目前为止我所做的事情 我有以下方法 enum Abc { A = 0, B = 1, C = 2, D = 3, E = 4, } int GetSum(Abc abc) { int sum = 0; if(abc != Abc.A) { sum += 23; }
enum Abc
{
A = 0,
B = 1,
C = 2,
D = 3,
E = 4,
}
int GetSum(Abc abc)
{
int sum = 0;
if(abc != Abc.A)
{
sum += 23;
}
if(abc != Abc.B)
{
sum += 68;
}
if(abc != Abc.C)
{
sum += 96;
}
if(abc != Abc.D)
{
sum += 57;
}
if(abc != Abc.E)
{
sum += 63;
}
return sum;
}
在向sum
添加值之前,我正在检查是否必须根据abc
的值进行添加
基本上,我希望如果abc
的值是abc.A
,那么执行除sum+=23之外的所有语句代码>
在我的代码中,if条件太多了。有没有办法用更少的if语句或其他方式(更好)来做事情
注意:-这里的sum+=//something
只是其中的一个语句,不需要该语句仅为加法(它将是任何形式)。通常,您要求的是switch
语句的某种相反形式;这不是一件事。我还要说,你所说的“如果
s,那么s太多”是主观的;如果这是一个要求,那么你所拥有的是一个相当简单的实现它的方法,我必须有一个具体的理由,希望有一个“更聪明”(即“更难阅读”)的解决方案
但是在您列出的特定情况下,您可以颠倒逻辑,然后使用常规的switch
语句
int GetSum(Abc abc)
{
int sum = 307; //23 + 68 + 96 + 57 + 63
switch (abc) {
case Abc.A:
sum -= 23;
break;
case Abc.B:
sum -= 68;
break;
// etc.
}
return sum;
}
显然,如果单个语句更复杂,以至于您无法“从末尾开始”并反转逻辑——特别是如果每个语句都有副作用——那么这种方法将不适用。但是,在更复杂的情况下,可能还有其他更合理的模式。(很可能只包括运行
if
语句。)一般来说,您要求的是开关的某种相反的语句;这不是一件事。我还要说,你所说的“如果
s,那么s太多”是主观的;如果这是一个要求,那么你所拥有的是一个相当简单的实现它的方法,我必须有一个具体的理由,希望有一个“更聪明”(即“更难阅读”)的解决方案
但是在您列出的特定情况下,您可以颠倒逻辑,然后使用常规的switch
语句
int GetSum(Abc abc)
{
int sum = 307; //23 + 68 + 96 + 57 + 63
switch (abc) {
case Abc.A:
sum -= 23;
break;
case Abc.B:
sum -= 68;
break;
// etc.
}
return sum;
}
显然,如果单个语句更复杂,以至于您无法“从末尾开始”并反转逻辑——特别是如果每个语句都有副作用——那么这种方法将不适用。但是,在更复杂的情况下,可能还有其他更合理的模式。(很可能只包括运行
if
语句。)您可以使用包含操作
对象(代理的现代变体)的字典
:
您可以使用包含
操作
对象的字典
(代理的现代变体):
与@PeterB的答案类似,但仅适用于您的sum示例:
int Method(Abc abc)
{
Dictionary<Abc, int> dictionary = new Dictionary<Abc, int>()
{
{ Abc.A, 23 },
{ Abc.B, 68 },
{ Abc.C, 96 },
{ Abc.D, 57 },
{ Abc.E, 63 }
};
return dictionary
.Where(kvp => kvp.Key != abc) // filter where Abc is different
.Sum(kvp => kvp.Value); // sum all values after filtering
}
int方法(Abc)
{
字典=新字典()
{
{Abc.A,23},
{Abc.B,68},
{Abc.C,96},
{Abc.D,57},
{Abc.E,63}
};
返回字典
.Where(kvp=>kvp.Key!=abc)//过滤abc不同的地方
.Sum(kvp=>kvp.Value);//对筛选后的所有值求和
}
@PeterB的答案非常好,可以在字典中轻松修改(新值、删除或修改),甚至可以更改要执行的工作。如果你只想对你的值求和,我的只是提供了一个“小”的快捷方式。与@PeterB的答案类似,但仅适用于你的求和示例:
int Method(Abc abc)
{
Dictionary<Abc, int> dictionary = new Dictionary<Abc, int>()
{
{ Abc.A, 23 },
{ Abc.B, 68 },
{ Abc.C, 96 },
{ Abc.D, 57 },
{ Abc.E, 63 }
};
return dictionary
.Where(kvp => kvp.Key != abc) // filter where Abc is different
.Sum(kvp => kvp.Value); // sum all values after filtering
}
int方法(Abc)
{
字典=新字典()
{
{Abc.A,23},
{Abc.B,68},
{Abc.C,96},
{Abc.D,57},
{Abc.E,63}
};
返回字典
.Where(kvp=>kvp.Key!=abc)//过滤abc不同的地方
.Sum(kvp=>kvp.Value);//对筛选后的所有值求和
}
@PeterB的答案非常好,可以在字典中轻松修改(新值、删除或修改),甚至可以更改要执行的工作。如果你只想对你的值求和,我的方法只会给你一个“小”的快捷方式。这感觉像是一个XY问题-。您的代码试图实现什么?而且这似乎非常适合。除此之外,您还可以使用-关键字。您的示例是否与实际代码相去甚远?或者它真的是一些相对简单的计算,没有进一步的副作用吗?这感觉像是一个XY问题-。您的代码试图实现什么?而且这似乎非常适合。除此之外,您还可以使用-关键字。您的示例是否与实际代码相去甚远?或者它真的是一些相对简单的计算,没有进一步的副作用吗?多么巧合——计算器上总共307个!因为这些值似乎不是标志,所以我甚至只需预计算一个数组,并使用枚举值作为索引。@Fildor-可能。视情况而定。如果其中一个值发生更改,则更新代码将变得更加困难。(对于一个预先计算的数组,你必须改变5到6件事。对于我上面展示的反向逻辑开关,有2件事。对于最初的实现,OP不想要,只有1件事真正改变了。)这就是我的意思,我需要一个聪明的理由,这就是为什么这个问题可能会受到过度简化的影响(甚至排除了更复杂的设计解决方案)绝对同意。真是巧合-计算器上总共307个!因为这些值似乎不是标志,我甚至只需预计算一个数组,并使用枚举值作为索引。@Fildor-可能。视情况而定。如果其中一个值发生更改,则更新代码会更困难。(使用