2012-01-27 6 views
5

Szukam standardowej/najlepszej praktyki dla scenariuszy, w których muszę sprawdzić tę samą właściwość obiektu względem listy wartości zwracających wartość true, jeśli któraś z wartości jest zgodna z właściwością.Potrzebujesz lepszego sposobu porównywania wielu wartości z właściwością i zwracania wartości true;

Obecnie kod przypomina to (nie pisać, szukam go byłaby) ...

if (object.property == "string1" 
        || object.property == "string2" 
        || object.property == "string3" 
         || object.property == "string4" 
         || object.property == "string5" 
           || object.property == "string6" 
           || object.property == "string7" 
            || object.property == "string8" 
            || object.property == "string9" 
             || object.property == "string10" 
             || object.property == "string11" 
              || object.property == "string12" 
              || object.property == "string13" 
               || object.property == "string14" 
               || object.property == "string15") 
+1

jeśli masz const ciągi - niż używać konstrukcji 'switch-case'. –

+0

Wszystkie prawidłowe odpowiedzi i znacznie ładniejsze niż to, co dostarczyłem. Dobra robota Panowie. Mam zamiar oddać Andrewowi mój głos, ponieważ wydaje się on najbardziej czytelny i powinien przydzielić najmniejszą ilość pamięci, ponieważ używa tablicy. Znowu Wielkie dzięki za wspaniałe odpowiedzi. – TXRAckAck

Odpowiedz

9
IEnumerable<string> items = new List<string>{ "string1", "string2" }; 

bool match = items.Contains(object.property); 
+0

niesamowite i szybkie – TXRAckAck

+0

@TXRAckAck - dzięki ;-) –

+3

HashSet będzie lepszym rozwiązaniem. O (1) zamiast O (n). ... zakładając, że ponownie użyjesz HashSet , a nie budujesz go za każdym razem. – MarkPflug

1

Można umieścić wartości w List<string> a następnie wykonaj następujące czynności:

List<string> values = new List<string>() {"string1", "string2"}; 

if(values.Contains(object.Property)) return true; 
4

Inne odpowiedzi sugerują, używając List<string>, ale HashSet<string> lepiej nadaje się do tego zadania:

HashSet<string> set = new HashSet<string>() { "string1", "string2", ..., "string15" }; 

if (set.Contains(object.Property)) 
    //... do something ... 

Albo, jak sugeruje anatoliiG, niech kompilator poradzić:

switch (object.property) 
{ 
    case "string1": 
    case "string2": 
    //... 
    case "string15": 
     //... do something ... 
     break; 
} 
+0

Upewnij się, że ponownie korzystasz z HashSet, inaczej nie będzie korzyści z wydajności w stosunku do listy . – MarkPflug

+0

Jeśli hashset jest już wyliczony, może być szybszy niż gigantyczna instrukcja switch (szczególnie w przypadku większych zestawów danych). – Matthew

+0

@ Mark absolutnie w prawo, i dzięki za wskazanie tego. Konstrukcja 'new Foo()' w przykładowym kodzie często prowadzi do nieefektywnego lub niepoprawnego kodu; 'new Random()' jest częstym tego przykładem. – phoog

0

Można spróbować LINQ o kod bardziej zwięzłe, takie jak:

bool match = new string[] { "string1", "string2" }.Any(p => p == object.property); 
+0

Likwidacja z wielu powodów. Nie najmniejszym z nich jest użycie "Count()> 0" zamiast Any(); – MarkPflug

+0

Masz cytatów wokół object.property. To wyraźnie nie jest to, co masz na myśli. Ponadto, aby uzyskać bardziej zwięzłe, co powiesz na nowe [] {"string1", "string2"}. Nie potrzebujesz tam "łańcucha", można go wywnioskować. Gotowe. – MarkPflug

+0

Bardzo dobrze o łańcuchu faktów można wywnioskować. Nigdy o tym nie myślałem. Tak, nie miałem na myśli cytatów wokół obiektu obj.prop. –

Powiązane problemy