【问题标题】:C# syntactic sugar similar to SQL's IN comparison?C#语法糖类似于SQL的IN比较?
【发布时间】:2012-07-06 04:56:36
【问题描述】:

我经常发现自己在编写类似于以下的条件句:

if(Path.GetExtension(filename) == ".pdf" || Path.GetExtension(filename)== ".doc")
{
    // do something
}

对我要测试的每个文件扩展名调用一次 Path.GetExtension() 似乎有点多余。当然,我可以这样做:

string fileExtension = Path.GetExtension(filename);
if(fileExtension == ".pdf" || fileExtension == ".doc")
{
    // do something
}

但考虑到我只使用 fileExtension 进行比较,没有别的,为文件扩展名声明一个变量似乎不是很优雅。

在 SQL 中,我可以使用 IN 运算符:

SELECT file FROM table WHERE fileExtension IN(".pdf", ".doc")

这让我无需重复即可执行测试。

C# 是否提供任何类似于 SQL 的语法糖,我不必重复被比较的变量或相等运算符?

【问题讨论】:

    标签: c# syntactic-sugar


    【解决方案1】:

    只需创建一个新的内联数组并调用Contains

    if((new[]{ ".pdf", ".doc"}).Contains(fileExtension))
    {
        // Do Something
    }
    

    【讨论】:

    • 我期待这样的事情。我认为为了比较而必须实例化一个新数组有点不幸,但这确实很好地传达了意图。
    【解决方案2】:

    如果你关心可读性,你可以选择一个

    switch (fileExtension)
    {
        case ".pdf":
        case ".doc":
            // do something                
            break;
    }
    

    如果您必须以不同方式处理其他扩展,这也是未来的证明。

    【讨论】:

      【解决方案3】:

      贾斯汀的回答肯定会做到这一点。但对我来说似乎有点矫枉过正。当然,除非您已经在集合中拥有要比较的扩展,否则与像在第二个示例中那样直接比较它们相比,似乎效率要低得多。 (您的第一个示例是 IMO 的一种糟糕方法。)

      但请注意,像在第二个示例中那样将结果存储在变量中可能非常有效。如果该变量仅用于随后的比较,编译器可以进行各种优化。它甚至可能根本不需要创建变量。

      【讨论】:

      • 这段代码不太可能对性能至关重要,因此代码可读性在选择时最重要。 IMO 当有两个或三个以上的扩展时,数组显然更好。
      • 给出的示例没有超过两个或三个扩展名。如果我正在写这篇文章并且有不止一对,我也会使用一个集合。但我会事先定义它,可能是一个静态成员,而不是每次进行比较时都创建它。每次比较时重新创建集合并使其成为比较语句的一部分似乎既不可读也不高效。
      【解决方案4】:

      虽然我看到您已经接受了解决方案,但我想提交我的解决方案,因为我认为它更符合您的意图。

      public static bool In(this object source, params object[] collection)
      {
          return collection.Contains(source);
      }
      

      用法:

      if(Path.GetExtension(filename).In(".pdf", ".doc"))
      {
          //Do something
      }
      

      希望对您有所帮助。

      编辑:在文件扩展名中添加句点以准确反映“GetExtension”的功能。

      【讨论】:

      • 谢谢。这很酷而且简洁。只需要提一件事,Path.GetExtension(string) 包括前导 '.',所以它应该是 Path.GetExtension(filename).In(".pdf", ".doc")。我尝试编辑,但它不允许我保存,因为至少要编辑 6 个字符。
      • 啊,我明白了。您可以在底部添加一个“编辑注释”,描述您为超过 6 个字符的限制而进行的编辑。我将编辑我的答案以反映它。
      【解决方案5】:

      如果你真的想让它读起来像 SQL 运算符,你可以使用扩展方法。

      public static bool In(this object o, IEnumerable c)
      {
          foreach (object i in c)
          {
              if (i.Equals(o))
              {
                  return true;
              }
          }
          return false;
      }
      

      用法:

      string fileExtension = ".pdf";
      string[] acceptedFileExtensions = new[] { ".pdf", ".doc" };
      
      if (fileExtension.In(acceptedFileExtensions))
      {
          // Do something
      }
      

      【讨论】:

        猜你喜欢
        • 2011-02-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-02
        相关资源
        最近更新 更多