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) |
根据msdn的文章,你可以通过
1 | file.name.Contains("SetupV8.exe", StringComparison.OrdinalIgnoreCase) |
这将更有效,因为在这个过程中您不会创建两个可变字符串,而且在我看来,看起来比使用
但是,您应该考虑在这里检查什么,文件哈希是否更好?如果假设文件的内容是已知的,则可能会引入安全问题。
做一个扩展方法
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 ! .... .... |
另外,由于
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",并且您不希望它有任何前缀/后缀,那么此时可能只需要直接检查是否相等。
编辑:也许更重要的是,您可能只想使用文件名。除非要检查目录路径的任何部分是否匹配。也就是说,您可能不希望
8年后为新读者编辑:有些边缘案例中,使用
只需将字符串强制为小写即可进行比较。
1 | file.ToLower().Contains("setupv8.exe") |