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

时间:2012-11-17 19:47:15

标签: c# .net

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

foreach (string file in directory.EnumerateFiles((AppDomain.CurrentDomain.BaseDirectory),  
         "*.exe", SearchOption.AllDirectories))
{
   if (!file.Contains("SetupV8.exe")
   {    
      // Do something
   }
}

由于

6 个答案:

答案 0 :(得分:10)

string.Contains 只是 string.IndexOf 的包装,您可以从.NET源代码中看到

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

和string.IndexOf有一个适当的参数来忽略要搜索的字符串的情况

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

StringComparison enum

答案 1 :(得分:2)

根据MSDN article,您可以传递StringComparison.OrdinalIgnoreCase进行比较,无论情况如何。

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

这样会更有效率,因为你不会在这个过程中创建两个mutalatable字符串,而且我认为看起来比使用.toLower()更清晰

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

答案 2 :(得分:2)

如果要比较整个文件名,包括扩展名但没有目录:

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

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

答案 3 :(得分:0)

只需将您的字符串强制为全部小写以进行比较..

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

答案 4 :(得分:0)

file.ToLower().Contains("setupv8.exe")通常可行。 (尽管你可能想要考虑使用EndsWith)

此外,由于EnumerateFiles返回FileInfo,您不妨检查其Name属性:

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() can introduce some unexpected results,所以也许最好使用ToLowerInvariant()代替。

答案 5 :(得分:0)

只需制作一个扩展方法

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

使用

....
if(file.Contains("SetupV8")) // the case is ignored !
....
....