2

異なる機能で同じスイッチ ケースを繰り返し使用する必要があります。関数が異なれば、switch ケースの定義も異なります。例えば:

    int groupID = somenumber;
    private void FunctionA()
    {
        switch (groupID)
        {
            case 0:
                // Do Action A
                break;
            case 1:
                // Do Action B
                break;
            case 2:
                // Do Action C
                break;
        }
    }

    private void FunctionB()
    {
        switch (groupID)
        {
            case 0:
                // Do Action Z
                break;
            case 1:
                // Do Action X
                break;
            case 2:
                // Do Action Y
                break;
        }
    }

同じスイッチケースを一度使用する方法はありますが、定義は異なる可能性がありますか?

4

3 に答える 3

6

あなたが達成したいことを行うためのより良い方法があると心から信じていますが、詳細を提供する必要があります.

現在の状況では、考えられる解決策の1つは次のとおりです。

private void SwitchStuff(Action action0, Action action1, Action action2)
{
    switch (groupID)
    {
        case 0:
            action0();
            break;
        case 1:
            action1();
            break;
        case 2:
            action2();
            break;
    }
}

そして、次のように使用します:

SwitchStuff(DoActionA, DoActionB, DoActionC);
SwitchStuff(DoActionX, DoActionY, DoActionZ);

これらのアクションはラムダ/通常のメソッドです。

于 2013-09-25T07:50:05.367 に答える
5

1 つの可能性は、次のように Action デリゲートを使用する 1 つのメソッドを使用することです。

private void MyFunction(int groupID, Action a, Action b, Action c)
{
    switch (groupID)
    {
        case 0:
            a();
            break;
        case 1:
            b();
            break;
        case 2:
            c();
            break;
    }
}

次に、次のように呼び出すことができます。

MyFunction( groupId, A, B, C );

また

MyFunction( groupId, Z, X, Y );

編集

または、より良い方法は、マシュー・ワトソンが提案したものの変形です:

メソッドを次のように変更します

private void MyFunction(int groupID, params Action[] actions)
{
  actions[groupId]();
}

スイッチケース全体を取り除きます。上記とまったく同じ方法で呼び出します。

于 2013-09-25T07:50:49.337 に答える
4

switch ステートメントをポリモーフィズムに置き換えることができます。グループを表すインターフェイスまたは基本クラスを作成します。

public interface Group
{
    void FunctionA(); // if Group is a class, then make these methods
    void FunctionB(); // virtual or abstract
}

次に、各グループのクラスを作成します (申し訳ありませんが、ここで 0,1,2 が何を意味するのかわかりません。よりわかりやすい名前を検討してください):

public class Group0 : Group
{
   public void FunctionA()
   {
      // Do Action A
   }

   public void FunctionB()
   {
      // Do Action Z
   }
}

次に、グループの適切なインスタンスを作成します。

private IGroup CreateGroup(int groupID)
{
    switch (groupID)
    {
        case 0: return new Group0();
        case 1: return new Group1();
        case 2: return new Group2();
        default: 
           throw new ArgumentException();
    }
}

そして、アプリケーションでグループのこのインスタンスを使用します (アプリケーションは、使用しているグループの実装を知りません):

IGroup group = CreateGroup(somenumber);
group.FunctionA(); // if group is Group1 then do action B
group.FunctionB(); // if group is Group1 then do action X
于 2013-09-25T07:51:09.163 に答える