C#语法糖类似于SQL的IN比较?

时间:2012-07-05 18:21:09

标签: c# syntactic-sugar

我经常发现自己写的条件类似于以下内容:

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的语法糖,我不必重复被比较的变量或等号运算符?

5 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:3)

如果您关心可读性,可以去

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

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

答案 2 :(得分:1)

贾斯汀的回答肯定会这样做。但对我来说似乎有些过分。当然,除非你已经在一个集合中有你要比较的扩展,否则它似乎比直接比较它们的效率要低得多,就像你在第二个例子中那样。 (你的第一个例子是IMO的坏方法。)

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

答案 3 :(得分:1)

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

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

用法:

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

希望有所帮助。

编辑:为文件扩展名添加了句点,以准确反映“GetExtension”的运行方式。

答案 4 :(得分:0)

如果你真的希望它像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
}