Użytkownik w moim systemie może mieć e-mail, telefon komórkowy lub telefon i na podstawie przekazanych wartości sprawdzam pewne warunki, a następnie ustawiam dla każdego z nich ContactDataStatus (który jest wyliczeniem). Następnie sprawdzam ContactDataStatus, czy podane dane kontaktowe są prawidłowe.

Wyliczenie ma następującą definicję

public enum ContactDataStatus
    {
        ExistsButUnverified = 1, 
        ExisitsAndVerified = 2, 
        IsValid = 3, 
        IsUninitialized = 4
    }

Napisałem następujące warunki, aby ustawić zmienną isValid

    isValid = false;
    if (emailStatus == ContactDataStatus.IsValid && 
       (mobileStatus == ContactDataStatus.IsValid || 
        mobileStatus == ContactDataStatus.IsUninitialized) 
        && (phoneStatus == ContactDataStatus.IsValid || 
        phoneStatus == ContactDataStatus.IsUninitialized))
    {
        isValid = true;
    }
    else if (mobileStatus == ContactDataStatus.IsValid && 
    (emailStatus == ContactDataStatus.IsValid || 
    emailStatus == ContactDataStatus.IsUninitialized) && 
    (phoneStatus == ContactDataStatus.IsValid || 
    phoneStatus == ContactDataStatus.IsUninitialized))
    {
       isValid = true;
    }
    else if (phoneStatus == ContactDataStatus.IsValid && 
    (emailStatus == ContactDataStatus.IsValid || 
    emailStatus == ContactDataStatus.IsUninitialized) && 
    (mobileStatus == ContactDataStatus.IsValid || 
    mobileStatus == ContactDataStatus.IsUninitialized))
    {
      isValid = true;
    }

Czy istnieje prostszy/krótszy sposób na napisanie tego?

c#
0
shashi 28 wrzesień 2012, 00:50

2 odpowiedzi

Najlepsza odpowiedź

Pomogłoby, gdybyś powiedział nam, jakie są wartości dla wyliczenia. Wygląda na to, że chcesz, aby co najmniej jedna z wartości była prawidłowa, a wszystkie wartości były niezainicjowane lub prawidłowe. Tak więc jednym ze sposobów wyrażenia tego byłoby:

var statuses = new[] { emailStatus, mobileStatus, phoneStatus };
bool valid = statuses.Any(x => x == ContactDataStatus.IsValid) &&
             statuses.All(x => x == ContactDataStatus.IsValid ||
                               x == ContactDataStatus.IsUninitialized);

Lub jeśli wyliczenie stanu to tylko IsValid, IsUninitialized i (powiedzmy) IsInvalid, a wiesz, że wartości faktycznie będą w tym zestawie, możesz pisać:

var statuses = new[] { emailStatus, mobileStatus, phoneStatus };
bool valid = statuses.Any(x => x == ContactDataStatus.IsValid) &&
             statuses.All(x => x != ContactDataStatus.IsInvalid);

Sugerowałbym również usunięcie prefiksu „is” z każdej z wartości wyliczenia — jest to po prostu puch, który utrudnia odczytanie kodu IMO.

6
Jon Skeet 28 wrzesień 2012, 00:55
var statuses = new[] { emailStatus, mobileStatus, phoneStatus };
bool isValid = statuses
    .Any(s => s == ContactDataStatus.IsValid && statuses.Except(new[] { s }).All(o => o == ContactDataStatus.IsValid || o == ContactDataStatus.IsUninitialized));
0
Lee 28 wrzesień 2012, 00:56