2012-01-27 53 views
5

我正在尋找一種方案的標準/最佳實踐,我需要根據值列表檢查相同的屬性值,如果任何值與該屬性匹配,則返回true。需要更好的方法來比較多個值與屬性並返回true;

目前的代碼類似這樣(我沒有寫出來,我期待重構它)...

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

如果你已經常量字符串 - 比使用'switch-case'結構。 – 2012-01-27 23:34:41

+0

所有有效的答案,比我提供的更好。幹得好的人。我打算給安德魯我的投票,因爲它看起來是最可讀的,應該使用字符串數組分配最少量的內存。再次非常感謝偉大的答案。 – TXRAckAck 2012-01-27 23:45:56

回答

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

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

真棒和快速 – TXRAckAck 2012-01-27 23:35:35

+0

@TXRAckAck - 謝謝;-) – 2012-01-27 23:36:40

+3

HashSet 將是一個更好的解決方案。 O(1)而不是O(n)。 ...假設您重用HashSet ,而不是每次都構建它。 – MarkPflug 2012-01-27 23:39:54

1

你可以把這些值在List<string>,然後做到這一點:

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

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

其他答案建議使用一個List<string>,但HashSet<string>更適合這項任務:

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

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

或者,如anatoliiG建議,讓編譯器處理:

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

只要確保您重用了HashSet,或者將不會有比列表更好的性能優勢。 – MarkPflug 2012-01-27 23:41:56

+0

如果已經計算了哈希集,它可能比巨大的開關語句更快(對於較大的數據集尤其如此)。 – Matthew 2012-01-27 23:42:32

+0

@馬克絕對正確,謝謝你指出。示例代碼中的新Foo()結構通常會導致代碼效率低下或不正確; '新的Random()'是一個常見的例子。 – phoog 2012-01-27 23:44:28

0

您可以嘗試LINQ一個更簡潔的代碼,如:

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

Downvoting有很多原因。其中最重要的是使用「Count()> 0」而不是Any(); – MarkPflug 2012-01-27 23:51:30

+0

你在object.property周圍有引號。這顯然不是你的意思。 另外,爲了更簡潔,新[] {「string1」,「string2」}如何?你不需要那裏的「字符串」,它可以被推斷出來。 完成。 – MarkPflug 2012-01-28 00:18:41

+0

很好的事實可以推斷出字符串。我從來沒想過這點。是的,我不是指obj.prop附近的引號。 – 2012-01-28 16:14:23

相關問題