我经常发现自己写的条件类似于以下内容:
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的语法糖,我不必重复被比较的变量或等号运算符?
答案 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
}