2012-07-05 80 views
3

我经常发现自己写条件语句类似以下内容:C#语法糖类似于SQL的IN比较?

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

回答

8

只需创建一个新的阵列内联和调用Contains

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

我期待着这样的事情。我认为为了比较而必须实例化一个新数组是有点不幸的,但这确实表达了这个意图。 – Andrew 2012-07-05 18:28:50

1

Justin的答案肯定会做到这一点。但似乎对我来说过分了。当然,除非你已经有一个扩展,你在集合中进行比较,看起来效率会比直接比较它们的效率要差一些,就像你在第二个例子中做的那样。 (你的第一个例子是一个不好的办法国际海事组织。)

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

+1

这段代码不太可能是性能至关重要的,因此在选择代码时可读性是最重要的。国际海事组织,当有超过两个或三个扩展,阵列显然更好。 – CodesInChaos 2012-07-05 18:26:11

+0

给出的示例没有超过两个或三个扩展。如果我正在写这篇文章并且不止一对,我也会使用一个集合。但是我会事先定义它,可能是一个静态成员,并且不会在每次进行比较时创建它。每次比较时重新创建集合,并将它作为比较语句的一部分看起来既不可读也不表现。 – 2012-07-05 18:27:45

3

如果你关心的可读性,你可以走了

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

,也是面向未来的情况下,你必须以不同的方式处理其他的一些推广。

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 
} 
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”的功能。

+0

谢谢。这很酷且简洁。只需要提一点,Path.GetExtension(string)包含前导'。',所以它应该是Path.GetExtension(filename).In(“。pdf”,“.doc”)。我试图编辑,但它不会让我保存,因为编辑至少有6个字符。 – Andrew 2012-08-01 19:35:23

+0

啊,我明白了。您可以在底部添加一个“编辑记事”,描述您为超过6个字符限制所做的修改。我会编辑我的答案以反映它。 – Thebigcheeze 2012-08-01 23:12:22