2012-01-27 6 views
5

Değerlerden herhangi biri özellikle eşleşiyorsa, bir nesnenin aynı özelliğini, doğru dönen değerlerin bir listesiyle karşılaştırmam gereken senaryolar için standart/en iyi bir uygulama arıyorum. Bir mülke karşı birden çok değeri karşılaştırıp doğru bir şekilde döndürmenin daha iyi bir yoluna ihtiyacınız var;

Şu kod

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

- anahtar kutusu tasarımını kullanmaktan –

+0

Tüm geçerli cevaplar ve sağladığımdan çok daha güzel. İyi iş beyler. Andrew'a oy vereceğim çünkü en okunaklı gibi görünüyor ve bir dizi dizisi kullandığından en az miktarda bellek ayırmalı. Yine harika cevaplar için çok teşekkürler. – TXRAckAck

cevap

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

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

müthiş ve hızlı – TXRAckAck

+0

@TXRAckAck - teşekkürler ;-) –

+3

HashSet daha iyi bir çözüm olurdu. O (1) yerine O (n). ... HashSet 'u yeniden kullandığınızı varsayar ve her seferinde oluşturmaz. – MarkPflug

1

Bunu daha sonra bir List<string> değerleri koymak ve edebilirsin ... (Ben bunu gözden geçirmeniz arıyorum, yazmadım) bu benzer:

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

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

Diğer cevaplar List<string> kullanmanızı öneririz, ancak HashSet<string> bu görev için daha uygundur:

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

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

Veya anatoliiG anlaşılacağı gibi, derleyici ele alalım: gibi

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

Sadece HashSet'i yeniden kullandığınızdan emin olun, aksi takdirde Listesinde bir performans avantajı olmaz. – MarkPflug

+0

Hashset zaten hesaplanmışsa, dev bir anahtar ifadesinden daha hızlı olabilir (özellikle daha büyük veri kümeleri için doğrudur). – Matthew

+0

@Mark kesinlikle doğru ve bunu işaret ettiğiniz için teşekkürler. Örnek koddaki 'yeni Foo()' yapısı çoğu zaman verimsiz ya da yanlış kodlara yol açmaktadır; 'Yeni Rastgele()' bunun sık bir örneğidir. – phoog

0

Bir daha özlü kodu için LINQ deneyebilirsiniz:

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

Birçok sebepten dolayı oy verme. En azı, Any() yerine "Count()> 0" kullanımı değil; – MarkPflug

+0

object.property öğesinden alıntılar var. Bu açıkça demek istediğin şey değil. Ayrıca, daha ayrıntılı bilgi için, yeni [] {"string1", "string2"}. Orada "String" e ihtiyacınız yok, bu çıkarım olabilir. Bitti. – MarkPflug

+0

Gerçek hakkında çok iyi dize çıkarılabilir. Bunu hiç düşünmemiştim. Evet, obj.prop etrafında alıntılar demek istemedim. –

İlgili konular