如何简化if语句字符串检查?

时间:2014-07-02 07:19:48

标签: c# c#-4.0

我有一个接受字符串的方法,我想返回true或false,这取决于字符串是否先前已经记录过。

到目前为止,我的内容如下:

string one = "abc";
string two = "def";
string three = "ghi";


MethodOne(string s)
{  
   if (s == one || s == two || s == three) 
       return true;
   else 
       return false;
 }

现在有一种更简单的方法可以在不使用大量||的情况下简化它和单字符串检查?

将它放在字符串数组中并使用

会更好吗?
 if (array.contains(s))

或类似的东西,其中array是要检查的字符串列表?

5 个答案:

答案 0 :(得分:3)

如果您想将字符串与其他字符串进行比较,可以使用Collection来简化代码,例如Array。然后你可以检查你要查找的字符串是否存在于数组中:

return  new [] { one, two, three }.Contains(s);

另一种选择是使用Any方法:

return  new [] { one, two, three }.Any(x => x == s);

当然,有很多方法可以做到这一点。但重点是选择正确的数据结构来简化代码并使其尽可能简单易读。

答案 1 :(得分:2)

如果你比速度和清晰度更关心内存,你也可以使用哈希集:

var hashSet = new HashSet<string> { "abc", "def", "ghi" };

hashSet.Contains("abc");

答案 2 :(得分:0)

正如您所建议的那样,最好是创建一个集合,然后检查其中是否存在值。

public bool MethodOne(string s)
{
    List<string> collection = new List<string>() {"abc", "def", "ghi"};

    return collection.Contains(s);
}

答案 3 :(得分:0)

如果您在编译时知道值或检查是主导操作(而不是modyfing集合),请考虑BinarySearch。它执行O(log n)时间检查(ContainsAny取O(n) - 线性):

var arr = new[] {"abc", "def", "ghi"}; // could be static or const for example
return Array.BinarySearch(arr, s) >= 0;

请记住,输入数组应保持排序。

O(log n)在检查大集合时很重要。 Here是包含比较的示例表。

答案 4 :(得分:0)

  

将它放在字符串数组中并使用

会更好吗?      

if(array.contains(s))

     

或类似的东西,其中array是要检查的字符串列表   反对?

是的,最好将检查字符串s所需的所有字符串包含在数组或类似结构中。

据我所知,这是检查字符串相等性的最佳选择,考虑到其他字符串,因为它提高了很多可读性。 这个表格:

var arr = new[] {"abc", "def", "ghi"};
return arr.Contains(s);

比以下内容更具可读性:

if (s == one || s == two || s == three) 
       return true;
   else 
       return false;

然后这个操作给另一个程序员会更清楚。 选择此表单的另一个原因是,这将使程序在将来更容易维护。如果你需要检查你的字符串与另一个字符串怎么办?您只需要在数组或集合中插入另一个元素,而不是在if语句中检查另一个字符串:

if (s == one || s == two || s == three || s == four) 

很明显,这个陈述难以维持,读起来非常可怕。

关于要使用的集合,我认为数组对于您的任务来说已经足够了,但是还有其他好的选择,例如List<string>HashSet<string>,正如其他用户所指出的那样。 / p>