たとえば、整数が4または10であるかどうかをチェックするチェックの膨大なリストがあります。たとえば、整数が4の場合は、このintを10に変更し、その逆も同様です。したがって、チェックの場合は次のようになります。
int i = getval();
if (i == 4)
{
i = 10;
}
else if (i == 10)
{
i = 4;
}
私の質問は、各条件をチェックする必要なしにこれを行う別の方法があります。
たとえば、整数が4または10であるかどうかをチェックするチェックの膨大なリストがあります。たとえば、整数が4の場合は、このintを10に変更し、その逆も同様です。したがって、チェックの場合は次のようになります。
int i = getval();
if (i == 4)
{
i = 10;
}
else if (i == 10)
{
i = 4;
}
私の質問は、各条件をチェックする必要なしにこれを行う別の方法があります。
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;
}
膨大なリストがある場合は、何らかのリスト構造を検討できます。
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 を呼び出すと、例外が発生します。その場合はどうするかを考える必要があるかもしれません。
「チェックの膨大なリスト」があることを考えると、スイッチの使用には同意しません。ディクショナリに裏打ちされた独自のクラスをチェックします。これにより、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);
}
}
switch(i)
{
case 4 : i=10; break;
case 10: i=4; break;
}
4 から 10 に行ったり戻ったりする簡単な方法がないため、何らかの if / switch ステートメントを回避することはできません。0 と X の間でスワップする場合は、variable = X - variable;
どちらをスワップしても問題ありませんが、4 と 10 の場合は上記のコードで問題ありません。
これを試して:
int i = getval() == 4 ? 10 : 4;
4かどうかを確認getval()
し、4 と 10 を切り替えます。
これはあなたが望むものです。
int i = getval();
switch (i)
{
case 4:
i=10;
break;
case 10:
i=4;
break;
}
誰かが私をこれに打ち負かしました(そして、議論の余地のあるより良いものを書きました)が、コードを書いたので、とにかく投稿しています。
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