Domanda

sto convertendo una logica VB6 a C # e ho incontrato la seguente / istruzione SELECT CASE.

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

Il meglio di conversione mi viene in mente è una serie di if / then / else che mappano ogni gamma, per es.

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

O c'è un modo migliore, per esempio un modo per mettere questi valori di range in un hash / array / raccolta di qualche tipo?

È stato utile?

Soluzione

Supponendo che si sta utilizzando 3.5 o superiore , e avere accesso a metodi di estensione:

Se avessi che molti paragoni vorrei creare un metodo piacevole per me:

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

Poi usarlo:

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

Se non si dispone di 3.5 o non si desidera utilizzare metodi di estensione:

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

quindi di usarlo:

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

Altri suggerimenti

Forse è possibile creare metodo di estensione su int come:

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

e utilizzarlo in codice come

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

pensieri aggiuntivi

Se l'elaborazione sulla base di questo, forse è possibile utilizzare qualcosa del genere

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. Non è sicuro questo è al 100% il codice di lavoro, scritto da cima della mia testa p.p.s. Triead e ora sto abbastanza sicuro che tutto funzioni

Il metodo che si descrive è la trasformazione letterale da VB a C #. Tuttavia, questo è così tanti dati che sembra meglio in un file di configurazione che nel codice. Se lo fai, il modo più semplice è probabilmente quello di semplicemente scorrere la lista con zipcodes e confrontare uno per uno.

Un modo più efficace sarebbe quella di ordinare i zipcodes e fare una ricerca binaria, o utilizzare una funzione hash o qualcosa di simile, ma sarei sorpreso se questo risulta essere un collo di bottiglia.

Se si voleva fare un po 'di dato si avvicina un po' di più astratto, si potrebbe andare con un metodo di estensione, come ad esempio:

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;
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top