代码之家  ›  专栏  ›  技术社区  ›  yajiv

如何根据某些条件执行除一条以外的所有语句?

  •  0
  • yajiv  · 技术社区  · 6 年前

    假设我有一个方法 方法调用时将执行的多个语句,除了一个 . (将根据传递给方法的参数来决定一条不执行的语句)。

    到目前为止我做过的事情。

    我有以下方法。

    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; .

    注:- sum += //something 只是其中的一个语句,不必只添加语句(它将是任何内容)。

    3 回复  |  直到 6 年前
        1
  •  2
  •   Peter B    6 年前

    你可以用一个 Dictionary 包含 Action

    int GetSum(Abc abc)
    {
        int sum = 0;
        var actionDict = new Dictionary<Abc, Action>
            {
                { Abc.A, () => sum += 23 },
                { Abc.B, () => sum += 68 },
                { Abc.C, () => sum += 96 },
                { Abc.D, () => sum += 57 },
                { Abc.E, () => sum += 63 }
            };
    
        foreach (var key in actionDict.Keys)
            if (key != abc) actionDict[key]();
    
        return sum;
    }
    

    注意用字典, 顺序 .Keys .

    int GetSum(Abc abc)
    {
        int sum = 0;
        var actions = new List<KeyValuePair<Abc, Action>>
        {
            KVP(Abc.A, () => sum += 23),
            KVP(Abc.B, () => sum += 68),
            KVP(Abc.C, () => sum += 96),
            KVP(Abc.D, () => sum += 57),
            KVP(Abc.E, () => sum += 63)
        };
    
        foreach (var action in actions)
            if (action.Key != abc) action.Value();
    
        return sum;
    }
    
    KeyValuePair<Abc, Action> KVP(Abc x, Action y)
    {
        return new KeyValuePair<Abc, Action>(x, y);
    }
    
        2
  •  1
  •   Mark Adelsberger    6 年前

    一般来说你要求的是 switch 陈述;这不是一件事。我还要说你说的“太多了” if “s”是主观的;如果这是要求,那么你所拥有的是一种相当直接的实现它的方法,我必须有一个具体的理由想要一个“更聪明”(即“更难阅读”)的解决方案。

    但是在 具体的 转换 陈述。

    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;
    }
    

    显然,如果单个语句更复杂,以至于不能“从末尾开始”并颠倒逻辑(特别是如果每个语句都有副作用),那么这种方法将不适用。但是,在一个更复杂的情况下,可能还有一些其他的模式更有意义。(很可能,包括 如果

        3
  •  0
  •   Maxime Recuerda    6 年前

    类似于@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
    }
    

    @PeterB的答案非常好,可以在字典中轻松修改(新值、删除或修改一个值),甚至可以更改要做的工作。
    如果你只想把你的价值加起来,我的只是给了你一个“小”的捷径。

    推荐文章