3

たとえば、整数が4または10であるかどうかをチェックするチェックの膨大なリストがあります。たとえば、整数が4の場合は、このintを10に変更し、その逆も同様です。したがって、チェックの場合は次のようになります。

int i = getval();
if (i == 4)
{
    i = 10;
}
else if (i == 10)
{
    i = 4;
}

私の質問は、各条件をチェックする必要なしにこれを行う別の方法があります。

4

8 に答える 8

6

switchステートメントを探しています。

int i = getval();
switch(i)       
      {         
         case 4:   
            i = 10;
            break;                  
         case 10:            
            i = 4;
            break;                 
         default:            
            Console.WriteLine("Invalid selection. Please select 4 or 10.");            
            break;      
       }
于 2012-10-26T17:24:19.720 に答える
6

膨大なリストがある場合は、何らかのリスト構造を検討できます。

static Dictionary<int, int> exchange = new Dictionary<int, int>();

static Constructor()
{
    AddExchangePair(4, 10);
    AddExchangePair(3, 12);
    ...
}

static void AddExchangePair(int a, int b)
{
    exchange.Add(a,b);
    exchange.Add(b,a);
}

public staic bool Exchange(ref int value)
{
    int newValue = 0;
    bool exchanged = exchange.TryGetValue(value, out newValue);
    if (exchanged) value = newValue;
    return exchanged;
}

これは、交換ペアの巨大なリストに対して機能します。

(7,14) と (14, 16) などの重複した番号で AddExchangePair を呼び出すと、例外が発生します。その場合はどうするかを考える必要があるかもしれません。

于 2012-10-26T17:38:30.187 に答える
2

「チェックの膨大なリスト」があることを考えると、スイッチの使用には同意しません。ディクショナリに裏打ちされた独自のクラスをチェックします。これにより、switch ステートメントのサイズを最小限に抑え、チェックと残りのコードを分離することができます。

class Cases
{
    private  static readonly Dictionary<int, int>
        List = new Dictionary<int, int>
        {
            {9, 5},
            {3, 2},
            {7, 12},
            {4, 10}
        }; 
    public static int GetCaseValue (int v)
    {
        int result = 0;
        return List.TryGetValue(v, out result) ? result : v;
    }
}
class Program
{
    public static void Main()
    { 
        var test = Cases.GetCaseValue(4);
        test = Cases.GetCaseValue(12);
    }
}
于 2012-10-26T17:52:29.840 に答える
1
switch(i)
{
case 4 : i=10; break;
case 10: i=4; break;
}
于 2012-10-26T17:25:26.940 に答える
1

4 から 10 に行ったり戻ったりする簡単な方法がないため、何らかの if / switch ステートメントを回避することはできません。0 と X の間でスワップする場合は、variable = X - variable;どちらをスワップしても問題ありませんが、4 と 10 の場合は上記のコードで問題ありません。

于 2012-10-26T17:25:49.420 に答える
1

これを試して:

int i = getval() == 4 ? 10 : 4;

4かどうかを確認getval()し、4 と 10 を切り替えます。

于 2012-10-26T17:25:56.410 に答える
1

これはあなたが望むものです。

int i = getval();
switch (i)
{
    case 4:
    i=10;
    break;
    case 10:
    i=4;
    break;
}
于 2012-10-26T17:26:19.530 に答える
1

誰かが私をこれに打ち負かしました(そして、議論の余地のあるより良いものを書きました)が、コードを書いたので、とにかく投稿しています。

refまた、ここでの使用は、おそらくあなたの質問への準拠を維持するためだけに両方の回答に含まれていることをスローしますSwap(ref i).i = Swap(i)一致が見つかりませんでした。もちろん、あなたが使用する必要がある理由があるかもしれませんref.

void Main()
{   
    int i;

    i = 1; 
    Swap(ref i); // no swap
    Console.WriteLine (i);

    i = 10; 
    Swap(ref i); // swap with 4
    Console.WriteLine (i);

    i = 4;
    Swap(ref i); // swap with 10
    Console.WriteLine (i);
}

void Swap(ref int i)
{
    if(swaps == null)
    {
        swaps = new List<Tuple<int, int>>();
        swaps.Add(Tuple.Create(4, 10));
    }

    int compareTo = i;
    var swap1 = from c in swaps where c.Item1 == compareTo select c.Item2;
    var swap2 = from c in swaps where c.Item2 == compareTo select c.Item1;

    if(swap1.Any())
        i = swap1.Single();
    else if(swap2.Any())
        i = swap2.Single();
}

List<Tuple<int, int>> swaps;

出力:

1
4
10
于 2012-10-26T17:50:24.173 に答える