与SQL类似的C#语法糖';相比之下呢?

与SQL类似的C#语法糖';相比之下呢?,c#,syntactic-sugar,C#,Syntactic Sugar,我经常发现自己写的条件句与下面类似: if(Path.GetExtension(filename) == ".pdf" || Path.GetExtension(filename)== ".doc") { // do something } 对于我要测试的每个文件扩展名,调用Path.GetExtension()一次似乎有点多余。当然,我可以这样做: string fileExtension = Path.GetExtension(filename); if(fileExtension

我经常发现自己写的条件句与下面类似:

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
}
但是考虑到我只使用文件扩展名进行比较,而没有其他用途,为文件扩展名声明一个变量似乎不是很优雅

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

SELECT file FROM table WHERE fileExtension IN(".pdf", ".doc")
这让我可以不重复地进行测试


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

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

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

贾斯汀的回答肯定可以。但对我来说,这似乎太过分了。当然,除非在集合中已经有了要比较的扩展,否则与第二个示例中直接比较它们相比,这似乎效率要低一些。(你的第一个例子是一个糟糕的方法。)


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

如果您关心可读性,您可以选择

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

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

如果您真的希望它读起来像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
}
if(Path.GetExtension(filename).In(".pdf", ".doc"))
{
    //Do something
}

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

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

string fileExtension = ".pdf";
string[] acceptedFileExtensions = new[] { ".pdf", ".doc" };

if (fileExtension.In(acceptedFileExtensions))
{
    // Do something
}
if(Path.GetExtension(filename).In(".pdf", ".doc"))
{
    //Do something
}
希望有帮助


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

这段代码不太可能对性能至关重要,因此在选择时,代码可读性是最重要的。在IMO中,当有两个或三个以上的扩展时,数组显然更好。给出的示例没有超过两个或三个扩展。如果我写这篇文章的时候有不止两篇,我也会使用一个集合。但是我会预先定义它,可能是一个静态成员,而不是每次比较时都创建它。每次比较时重新创建集合并使其成为比较语句的一部分似乎既不可读也不性能。我认为仅仅为了比较而必须实例化一个新数组是有点不幸的,但这确实传达了意图。谢谢。这很酷,也很简洁。只需提及一件事,Path.GetExtension(string)包含前导“.”,因此它应该是Path.GetExtension(filename).In(“.pdf”、“.doc”)。我试图编辑,但它不允许我保存,因为编辑的最小字符数为6个。啊,我明白了。您可以在底部添加一个“编辑注释”,描述您正在进行的编辑,以超过6个字符的限制。我将编辑我的答案以反映它。