3

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

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

4

5 回答 5

8

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

if((new[]{ ".pdf", ".doc"}).Contains(fileExtension))
{
    // Do Something
}
于 2012-07-05T18:22:09.617 回答
3

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

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

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

于 2012-07-05T18:30:43.643 回答
1

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

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

于 2012-07-05T18:23:56.210 回答
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”的功能。

于 2012-07-31T22:32:16.173 回答
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
}
于 2012-07-05T18:33:43.733 回答