2010-06-24 51 views
50

讓我們說我有這樣的代碼如何忽略列表大小寫<string>

string seachKeyword = ""; 
List<string> sl = new List<string>(); 
sl.Add("store"); 
sl.Add("State"); 
sl.Add("STAMP"); 
sl.Add("Crawl"); 
sl.Add("Crow"); 
List<string> searchResults = sl.FindAll(s => s.Contains(seachKeyword)); 

我怎麼能忽略字母的大小寫在包含搜索?

感謝,

回答

61

的最好的辦法是使用序區分大小寫的比較的另一種方法,然而,Contains方法不支持它。

您可以使用以下方法來做到這一點:

sl.FindAll(s => s.IndexOf(searchKeyword, StringComparison.OrdinalIgnoreCase) >= 0); 

這將是更好的擴展方法來包裝這個,比如:

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

所以,你可以使用:

sl.FindAll(s => s.Contains(searchKeyword, StringComparison.OrdinalIgnoreCase)); 
+1

這是不是意味着,給定的OP的問題列表,即 'sl.FindAll(S => s.Contains( 「STAT」,StringComparison.OrdinalIgnoreCase));' 將返回' TRUE'?儘管可以設想,但我更喜歡列表''上的Contains,它只在兩個字符串的長度相等的情況下才返回true,而不管情況如何,而如果列表包含一個包含搜索的字符串,則返回true參數。所以... 'return target.IndexOf(value,comparison)> = 0 && target.Length == value.Length;' – GCymbala 2015-01-14 20:31:03

+0

+2 if if could。正是我所需要的 – 2015-07-20 16:15:35

-1

一個可能的(可能不是最好的),是你小寫全部投入SL的字符串。然後你小寫searchKeyword。

另一種解決方案是編寫小寫2個字符串參數並對它們進行比較

6

最佳解決方案是在執行比較時忽略該情況

List<string> searchResults = sl.FindAll(s => s.IndexOf(seachKeyword, System.StringComparison.OrdinalIgnoreCase) >= 0); 
68

使用LINQ,這增加了一種新的方法來.Compare

using System.Linq; 
using System.Collections.Generic; 

List<string> MyList = new List<string>(); 
MyList.Add(...) 
if (MyList.Contains(TestString, StringComparer.CurrentCultureIgnoreCase)) { 
    //found 
} 

所以想必

using System.Linq; 
... 

List<string> searchResults = sl.FindAll(s => s.Contains(seachKeyword, StringComparer.CurrentCultureIgnoreCase)); 
+2

啊哈!我錯誤地使用了StringComparison!謝謝! – 2014-05-26 12:19:12

+0

只是一個註釋:這不適用於 - 在文本方案中搜索單詞,因爲包含將搜索完整的文本。當然,這不是問題中的場景,您的答案完美無缺。 :) – 2015-10-07 08:40:35

+1

@ Ankur-m你可能想要一個正則表達式。現在你有兩個問題。 – 2015-10-21 03:40:26

5
StringComparer.CurrentCultureIgnoreCase is a better approach instead of using indexOf. 
+0

」是一種更好的方法,而不是使用indexOf。「爲什麼實際上? – 2017-08-28 06:52:55

0

您可以通過該應用小動作。
改變所有的字符串相同情況下:要麼大寫或小寫

列表SearchResult所= sl.FindAll(S =>s.ToUpper()。載(seachKeyword.ToUpper() ));

0

對於那些在搜索LIST列表時遇到問題的人,我找到了一個解決方案。

在這個例子中,我正在搜索Jagged List,只抓取具有與參數匹配的第一個字符串的列表。

List<List<string>> TEMPList = new List<List<string>>(); 

TEMPList = JaggedList.FindAll(str => str[0].ToLower().Contains(arg.ToLower())); 

DoSomething(TEMPList); 
0

FindAll枚舉整個列表。

更好的方法是在找到第一個實例後中斷。

bool found = list.FirstOrDefault(x => String.Equals(x,searchKeyWord,Stringcomparison.OrdinalIgnoreCase)!= null;

12

您可以通過提供不區分大小寫的相等比較像這樣使用Contains

if (myList.Contains(keyword, StringComparer.OrdinalIgnoreCase)) 
{ 
    Console.WriteLine("Keyword Exists"); 
} 
+0

請注意,您需要包含linq「using System.Linq;」 – 2017-03-29 05:35:19

+0

這是最簡單的答案,並且工作得很好。 – 2017-05-03 14:10:55

+0

這是真正的答案 – 2017-11-30 12:07:01

0

下面的方法將搜索您需要的關鍵字,並插入所有搜索過的項目進入一個新的列表,然後返回新的列表。

private List<string> serchForElement(string searchText, list<string> ListOfitems) 
{    
    searchText = searchText.ToLower(); 
    List<string> Newlist = (from items in ListOfitems 
         where items.ToLower().Contains(searchText.ToLower()) 
         select items).ToList<string>(); 

return Newlist; }

+1

最好包含一段代碼的解釋。 – 2017-09-20 05:16:30

+0

「ListOfitems」是您的列表。 searchText是要搜索的關鍵字。我做的一個錯誤是我做了兩次小寫。它不需要兩次。 – 2017-09-20 06:10:45