【问题标题】:How to simplify an if statement String checking?如何简化 if 语句字符串检查?
【发布时间】:2014-07-02 07:19:47
【问题描述】:

我有一个接受字符串的方法,我想根据字符串之前是否记录过返回真或假。

到目前为止,我有如下:

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 是要检查的字符串列表?

【问题讨论】:

  • array.Contains(s) 有什么问题?检查给定项目是否与数组中的某个项目匹配的最简单方法。你仍然找不到更好的选择
  • 是的,我想这会很好,但只是想知道是否还有其他选择?这更多是因为我刚刚学习 c#,并且对其他的做事方式感到好奇。
  • "将它放在一个字符串数组中并只使用 array.contains 会更好吗?"只有你知道它是否对你更好。
  • @SamIAm 老实说,如果您只是在学习,我会将精力集中在其他领域,而不是简化 3 个布尔 || 运算符...
  • 您可以使用集合而不是单个字段吗?这三个变量是固定的还是您预计将来会有更多变量?您可以使用数组或列表,甚至是哈希集或字典。如果是这样,您应该使用ContainsAny(对于没有Equals 的复杂对象)。

标签: c# c#-4.0


【解决方案1】:

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

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

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

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

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

【讨论】:

  • @SergeyBerezovskiy 和我确认这是正确的选择,将其发布为答案:)
  • :) 好的,只是奇怪的问题,contains 回答
  • 如果使用array.Contains 更好,它不会回答这个问题。没有解释,这个答案是没有用的。但是,恕我直言,这个问题是主观的。
【解决方案2】:

如果您更关心速度和清晰度而不是内存,也可以使用哈希集:

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

hashSet.Contains("abc");

【讨论】:

    【解决方案3】:

    按照您的建议,最好的方法是创建一个集合,然后检查其中是否存在值。

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

    【讨论】:

      【解决方案4】:

      如果您在编译时知道值或检查是主导操作(而不是修改集合),请考虑 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 是带有比较的示例表。

      【讨论】:

        【解决方案5】:

        将它放在一个字符串数组中并使用会更好

        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&lt;string&gt;HashSet&lt;string&gt;,正如其他用户所指出的那样。

        【讨论】:

          猜你喜欢
          • 2015-12-02
          • 2017-03-09
          • 1970-01-01
          • 1970-01-01
          • 2021-11-20
          • 2014-06-18
          • 1970-01-01
          • 2017-10-25
          • 1970-01-01
          相关资源
          最近更新 更多