【问题标题】:Can I make a "Contains" Method be case insensitive with C#?我可以使用 C# 使“包含”方法不区分大小写吗?
【发布时间】:2012-11-17 19:47:14
【问题描述】:

我正在使用 .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
   }
}

谢谢

【问题讨论】:

  • file.ToLower().Contains("setupv8.exe") 通常可以正常工作。 (虽然你可能想考虑EndsWith
  • 哦,看在皮特的份上。当然可以。谢谢!

标签: c# .net


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      根据MSDN article,您可以传入StringComparison.OrdinalIgnoreCase 进行比较,而不考虑大小写。

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

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

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

      【讨论】:

      • String.Contains 是否有接受StringComparison 的重载?
      【解决方案4】:

      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”,并且您不希望它带有任何前缀/后缀,那么此时可能只是直接检查是否相等。

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

      8 年后为新读者编辑:在某些极端情况下使用 ToLower() can introduce some unexpected results,因此使用 ToLowerInvariant() 可能会更好。

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

        • 谢谢。我想我需要睡觉了。
        【解决方案6】:

        只做一个扩展方法

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

        用法

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-10-20
          • 1970-01-01
          • 2016-06-12
          • 2012-02-18
          • 1970-01-01
          • 1970-01-01
          • 2023-04-02
          相关资源
          最近更新 更多