2012-01-27 51 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

相关问题