关于.net:我可以使用C#使“包含”方法不区分大小写吗?

Can I make a “Contains” Method be case insensitive with C#?

我使用的是.NET 4.5和C。如果拼写区分大小写,下面的代码可以正常工作。换句话说,如果文件的拼写与"setupv8.exe"完全相同。但我真的需要不区分大小写。我玩过,但找不到方法。

1
2
3
4
5
6
7
8
foreach (string file in directory.EnumerateFiles((AppDomain.CurrentDomain.BaseDirectory),  
        "*.exe", SearchOption.AllDirectories))
{
   if (!file.Contains("SetupV8.exe")
   {    
      // Do something
   }
}

谢谢


string.contains只是一个围绕string.indexof的包装器,从网络源中可以看到。

1
2
3
4
public bool Contains(string value)
{
    return (this.IndexOf(value, StringComparison.Ordinal) >= 0);
}

和string.indexof有一个适当的参数来忽略要搜索的字符串的大小写

1
2
 if (file.IndexOf("SetupV8.exe", StringComparison.OrdinalIgnoreCase) >= 0)
     // File found

StringComparison枚举


如果要比较整个文件名(包括扩展名但不包括目录),请执行以下操作:

1
file.Name.Equals(fileNameAndExt, StringComparison.OrdinalIgnoreCase)

file.FullName还包括目录名。StringComparison.OrdinalIgnoreCase是最快的比较方法,因为它不适用于特定的培养处理。这是正确的方法,因为文件系统也不这样做。


根据msdn的文章,你可以通过StringComparison.OrdinalIgnoreCase进行比较,不管情况如何。

1
file.name.Contains("SetupV8.exe", StringComparison.OrdinalIgnoreCase)

这将更有效,因为在这个过程中您不会创建两个可变字符串,而且在我看来,看起来比使用.toLower()更干净。

但是,您应该考虑在这里检查什么,文件哈希是否更好?如果假设文件的内容是已知的,则可能会引入安全问题。


做一个扩展方法

1
2
3
4
public bool Contains(this string my,string his)
 {
      return my.ToLower().Contains(his.ToLower());
 }

使用

1
2
3
4
....
if(file.Contains("SetupV8")) // the case is ignored !
....
....

file.ToLower().Contains("setupv8.exe")通常工作正常。(尽管你可能会考虑用endswith代替)

另外,由于EnumerateFiles返回FileInfo属性,您还可以检查它的Name属性:

1
2
3
4
5
6
7
8
foreach (FileInfo file in directory.EnumerateFiles((AppDomain.CurrentDomain.BaseDirectory),  
        "*.exe", SearchOption.AllDirectories))
{
   if (!file.Name.ToLower().Contains("setupv8.exe")
   {    
      // Do something with file
   }
}

另外,如果名称是"SETUPV8.EXE",并且您不希望它有任何前缀/后缀,那么此时可能只需要直接检查是否相等。

编辑:也许更重要的是,您可能只想使用文件名。除非要检查目录路径的任何部分是否匹配。也就是说,您可能不希望c:\temp\setupv8.exe_directory\subdirectory\setupv8.exe匹配为假阳性。

8年后为新读者编辑:有些边缘案例中,使用ToLower()可能会带来一些意想不到的结果,因此也许最好使用ToLowerInvariant()


只需将字符串强制为小写即可进行比较。

1
file.ToLower().Contains("setupv8.exe")