2010-08-02 10 views
6

AmigosComplejo si no lógica

¿Cómo implemento la lógica de seguimiento complejo?

flag1 puede ser "N" o "A" o "I"
flag2 puede ser "N" o "A" o "I"
flag3 puede ser "N" o "A" o "I"

función (flag1 cadena, flag2 cadena, flag3 cadena) comienzan

La función debe devolver:

  1. retorno "Ninguno" si flag1, flag2 y flag3 son "N"

  2. demás volver "Activo" si flag1, flag2 y flag3 son "A"

  3. o regrese "inactivo" si flag1, flag2 y flag3 son "I"

  4. retorno demás "ambos" si flag1, flag2 y flag3 son o bien "A" y "I" (o "N")

por ejemplo, 1) flag1 es "A" y flag2 es "I" y flag3 es "I"
p. 2) flag1 es "I" y flag2 es "A" y flag3 es "I"
p. Ej. 2) flag1 es "A" y flag2 es "N" y flag3 es "I"

resultado retrun

extremo

Gracias por la respuesta, pero ninguno de poste da respuesta. Sé si de otra manera restringen y buscan lógica para implementar el psedocode anterior. Las cuatro son condiciones posibles, especialmente el # 4 es complejo y necesita saber cómo implementarlo.

+4

¿Realmente está preguntando cómo componer la lógica booleana? ¿O estás buscando una alternativa para hacerlo? –

+0

@Kumar: ¿quieres que traduzcamos tu pseudocódigo a C#, que será casi sencillo? –

+1

¿Cómo debemos leer el punto 4? Esos parens no tienen sentido ahora. –

Respuesta

20

Su lógica para el punto 4 es confuso ...

Yo uso un valor de enumeración para esto, en lugar de cuerdas? - es mucho más de tipo seguro (por ejemplo, qué pasa si alguien "WIBBLEWOBBLE" a su método de Lo ¿debería volver?)

enum Value { None, Active, Inactive, Both } 

private Value GetValue(Value flag1, Value flag2, Value flag3) { 
    if (flag1 == flag2 && flag2 == flag3) // they are all the same 
     return flag1; 
    else return Value.Both; // there is a difference 
} 
+1

+1 para enums ... y 3 líneas para una hinchada Q :) – Vishal

+0

+1 para el simple simple if/else –

+2

elimine el else, ya ha devuelto si el if fue verdadero . De lo contrario, +1 para poder averiguar los requisitos arcanos publicados. Suponiendo que su interpretación es correcta. –

1

Creo que sirve para la legibilidad y la velocidad si primero comprueba si los 3 valores son iguales.

if ((flag1 == flag2) and (flag1 == flag3)) 
    // use a switch or table to go 'I' -> Inactive etc 
else 
    return "Both"; // as far as i understood 4) 
0

Esto * funcionaría. No puedo decir que me gusta.

string key = flag1 + flag2 + flag3; 
switch(key){ 
    case "NNN": 
     return "None"; 
     case "AAA": 
     return "Active"; 
     case "III": 
     return "Inactive"; 
     default: 
     break; 
    } 
    // ;) 
//Trying to make it as confusing as your requirement #4 
    var four = (
    from s in key 
    select s 
    ).Distinct(); 

    if(four.Count() > 1){ 
    return "Both"; 
    } 



} 
+0

Doy la bienvenida al negativo. Porque sé que es malo;) – Nix

+0

Has justificado el código incorrecto, no hay ninguna razón por la que debas votar aquí. –

2
[Flags] 
enum SomeWierdReturn 
{ Both = 0, None = 1, Active = 2, Inactive = 4 } 

public SomeWierdReturn DoSomething(SomeWierdReturn flag1, SomeWierdReturn flag2, SomeWierdReturn flag3) 
{ 
    return (SomeWierdReturn)(flag1 & flag2 & flag3); 
} 
0

Robaticus le dio la respuesta correcta, pero en un comentario en lugar de un puesto por lo que se expandirá en ella.

Tenemos tres indicadores que pueden tomar cada uno de los tres estados. Por lo tanto, hay 3 * 3 * 3 = 27 opciones posibles.

Cuando se enfrenta complejo si ... entonces la lógica y un espacio de direcciones tan pequeño no tiene sentido en absoluto para tratar de codificar todo el if..then. En cambio, una matriz tridimensional que contiene un total de 27 elementos.

const int Ninguno = 0; const int Inactive = 1; const int Active = 2;

int ParseFlag (Bandera cadena) privada { interruptor (Bandera) { caso "N": Ninguna regresar; caso "I": regreso Inactivo; caso "A": return activo; predeterminado lanzar nueva excepción (string.Format ("Obtuve un valor de indicador de {0} pero esperaba N, I o A", indicador)); }}

pública FlagResult de búsqueda (cadena Flag1, cadena Flag2, cadena flag3) { retorno FlagData [ParseFlag (Flag1), ParseFlag (Flag2), ParseFlag (flag3)]; }

Te dejaré construir la matriz.