[英]Can I make a “Contains” Method be case insensitive with C#?
我正在使用.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
}
}
謝謝
從NET資源中可以看到, string.Contains只是string.IndexOf的包裝。
public bool Contains(string value)
{
return (this.IndexOf(value, StringComparison.Ordinal) >= 0);
}
和string.IndexOf具有適當的參數來忽略要搜索的字符串的大小寫
if (file.IndexOf("SetupV8.exe", StringComparison.OrdinalIgnoreCase) >= 0)
// File found
根據MSDN文章,您可以傳入StringComparison.OrdinalIgnoreCase
進行比較(無論大小寫)。
file.name.Contains("SetupV8.exe", StringComparison.OrdinalIgnoreCase)
這將更加有效,因為您不會在此過程中創建兩個可變字符串,而且我認為比使用.toLower()
更干凈
但是,您應該考慮在此處檢查的內容,文件哈希會更好嗎? 如果假設文件的內容是已知的,則可能會引入安全問題。
如果要比較包括擴展名但不帶目錄的整個文件名:
file.Name.Equals(fileNameAndExt, StringComparison.OrdinalIgnoreCase)
file.FullName
還包括目錄名稱。 StringComparison.OrdinalIgnoreCase
是最快的比較方法,因為它不應用特定於文化的處理方法。 這是正確的方法,因為文件系統也不會這樣做。
只需將您的字符串全部小寫以進行比較。
file.ToLower().Contains("setupv8.exe")
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()
可能會帶來一些意外的結果 ,因此也許最好使用ToLowerInvariant()
。
只是做一個擴展方法
public bool Contains(this string my,string his)
{
return my.ToLower().Contains(his.ToLower());
}
用法
....
if(file.Contains("SetupV8")) // the case is ignored !
....
....
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.