Pregunta

Me estoy convirtiendo algo de lógica VB6 a C # y he encontrado la siguiente instrucción SELECT / CASO.

Select Case ZipCode
Case 1067 To 19417, 35075 To 35085, 48455 To 48465, 55583 To 55596, 67480 To 67551, 75392, 85126, _
    93047 To 93059, 21217 To 21739, 35091 To 35096, 48480, 55606 To 55779, 67655 To 67707, 76726 To 76835, _
    85221 To 87679, 94315 To 94419, 22844 To 25799, 35102, 48488, 56154 To 56254, 67731 To 67759, 76855 To 76889, _
    87719 To 88339, 94428 To 94437, 25868, 35112, 48499 To 48531, 56271, 67824 To 67829, 77761, 88353, 94522, _
    25879, 35117, 48653, 56281 To 56299, 69427 To 69429, 77773 To 77776, 88361 To 88364, 94553, 26121 To 26160, _
    35216 To 35282, 48720 To 48727, 56321 To 56337, 69437 To 69439, 78048 To 78126, 88368 To 88379, 94559, _
    26180 To 26215, 35287 To 35469, 49124 To 49356, 56410 To 56479, 70173 To 71287, 78136 To 79117, 88410, 95028 To 95032, _
    26316 To 26389, 35576 To 35768, 49406, 56575, 71332 To 71540, 80331 To 83313, 88481, 95111 To 95152, _
    26419, 36110, 49419, 56626 To 56648, 71546 To 71711, 83324 To 83362, 88529, 95176 To 95185, _
    26434 To 26441, 36304 To 36358, 49448, 56727 To 56745, 71720 To 72189, 83365 To 83379, 88633, 95188 To 95194, _
    26452, 36367 To 36369, 49453, 56751 To 57339, 72250 To 72417, 83413, 88662 To 90491, 95197

La mejor conversión que se me ocurre es una serie de if / then / else, que se asignan cada rango, por ejemplo.

if((ZipCode >= 1067 && ZipCode <=19417) ||
   (ZipCode >= 35075 && ZipCode <=35085) ||
   ...

¿O hay una mejor manera, por ejemplo, alguna manera de poner estos valores de rango en un hash / serie / colección de algún tipo?

¿Fue útil?

Solución

Si se asume que está utilizando 3.5 o superior , y tiene acceso a los métodos de extensión:

Si tuviera que muchas comparaciones que crearía un método agradable para mí mismo:

public static class IntUtils
{
    public static bool InRange(this int value, int low, int high)
    {
        return value <= low && value <= high;
    }
}

A continuación, se usa:

if (zipCode.InRange(1067, 19417) ||
    zipCode.InRange(35075, 35085) || ...

Si usted no tiene 3.5 o no desea utilizar los métodos de extensión:

public static class IntUtils
{
    public static bool InRange(int value, int low, int high)
    {
        return value <= low && value <= high;
    }
}

A continuación, se usa:

if (IntUtils.InRange(zipCode, 1067, 19417) ||
    IntUtils.InRange(zipCode, 35075, 35085) || ...

Otros consejos

Tal vez usted puede crear método de extensión en int como:

private static bool Between (this int i, int lower, int upper)
{
  return i >= lower && i <= upper;
}

y utilizarlo en código como

if ZipCode.Between(1067, 19417) || ZipCode.Between(35075, 35085) || ...

pensamientos adicionales

Si el procesamiento basado en esto, tal vez usted puede utilizar algo por el estilo

Dictionary<int[], Action> actionMap = new Dictionary<int[], Action>
{
  {new[]{1067,19417}, ProcessA},
  {new[]{35075, 35085}, ProcessB}
};

public void ProcessA()
{
  // do something;
}

public void ProcessB()
{
  // do something else;
}

public void Process(int zipCode)
{
  var action = actionMap.FirstOrDefault(a => zipCode >= a.Key[0] && zipCode <= a.Key[1]);
  if (action.Value != null)
  {
     action.Value();
  }
}

p.s. No estoy seguro es el código de trabajo del 100%, lo escribió desde la parte superior de la cabeza p.p.s. Triead y ahora estoy muy seguro de que está funcionando

El método que se describe es la transformación literal de VB a C #. Sin embargo, esto es por lo que la cantidad de datos que parece mejor en un fichero de configuración que en el código. Si lo hace, la forma más fácil es probablemente simplemente recorrer la lista con los códigos postales y de ellos se compara uno por uno.

Una manera más eficiente sería ordenar los códigos postales y hacer una búsqueda binaria, o utilizar una función hash o algo por el estilo, pero me sorprendería si este resulta ser un cuello de botella.

Si quería hacer algo de lo dado se acerca un poco más abstracto, que podría ir con un método de extensión, como por ejemplo:

public static class Utils
{
    public static bool InRange<T>(this T value, T low, T high) where T : IComparable
    {
        return low.CompareTo(value) <= 0 && high.CompareTo(value) >= 0;
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top