【问题标题】:Checking in D if a string is in array?如果字符串在数组中,则检查 D?
【发布时间】:2009-05-30 04:27:35
【问题描述】:

如何检查数组中出现的字符串?我的意思是我可以循环,但是有标准函数吗?

一开始是这样的:

if(str in ["first", "second", "third"])

但它抱怨in 仅适用于关联数组。

我尝试快速查找 phobos 文档,但没有找到任何与数组相关的模块。

那么有什么,还是我只需要手动循环遍历它?

编辑:

我在 D1,火卫一。

【问题讨论】:

    标签: arrays d phobos


    【解决方案1】:

    如果您的字符串是常量(如示例中所示),您可以使用关联数组字面量,但语法不漂亮:

    if (str in ["first"[]:0, "second":0, "third":0])
    

    我认为在 D1 的 Phobos 中没有可以使用的库调用,但 D2 的 std.algorithm 有一些你可以使用的东西:

    if (count(["first", "second", "third"][], str))
    

    在 Tango 中,您可以使用来自 tango.text.Util 的通用 contains 函数:

    if (contains(["first", "second", "third"][], str))
    

    请注意,数组文字末尾的[] 是必需的,因为我们需要传递静态数组的内存片,而不是按值传递实际的静态数组。

    【讨论】:

      【解决方案2】:

      使用 D1 Phobos,您必须自己动手。但这并不太难。

      bool contains(T)(T[] a, T v)
      {
          foreach( e ; a )
              if( e == v )
                  return true;
          return false;
      }
      

      另外,你应该可以这样使用它:

      auto words = ["first"[], "second", "third"];
      if( words.contains(str) ) ...
      

      希望对您有所帮助。

      顺便说一句,您可以修改上面的内容以用作“indexOf”函数:

      size_t indexOf(T)(T[] a, T v)
      {
          foreach( i, e ; a )
              if( e == v )
                  return i;
          return a.length;
      }
      

      【讨论】:

      • 这就是我最终要做的,除了我将它称为“in_array”而不是包含,并且我将项目作为第一个参数,但你的方式更好,因为它可以用作属性.为什么他们没有在火卫一中放这么简单的东西?
      • 很多东西不在Phobos中的原因是一样的:没有人有时间或兴趣。另外,每个人都在为 D 2.0 开发 Phobos2。
      • Walter 实际上反对以提问者期望的方式在数组上“工作”。原因: assoc 数组的“in”会告诉您密钥是否存在。所以他认为数组的“in”还应该检查“key”是否存在是元素索引,而不是值。所以他认为让它做显而易见的事情太不一致了。
      猜你喜欢
      • 2016-03-06
      • 1970-01-01
      • 2022-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多