3

我有一个庞大的检查列表,例如检查整数是 4 还是 10,如果是 4,它会将这个 int 更改为 10,反之亦然,所以我的 if 检查将是这样的:

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

你不会绕过某种 if / switch 语句,因为从 4 到 10 并返回没有简单的方法。如果它是 0 和 X 你之间交换,你可以去variable = X - variable;交换它就好了,但是对于 4 和 10,上面的代码很好。

于 2012-10-26T17:25:49.420 回答
1

试试这个:

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

那应该检查是否getval()为 4,然后在 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)并且 Swap 会返回它的输入,如果它没有找到匹配项。当然,您可能需要使用一个原因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 回答