2010-06-24 30 views
50

Diyelim Listesi'nde harf duyarlılığı göz ardı etmekNasıl bu kod var <string>

arama İçeriyor

nasıl harf harf göz ardı edebilirsiniz

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)); 
?

sayesinde olası

cevap

61

karşılaştırır başka bir yöntemi yazıyor, ancak Contains yöntem bunu desteklemez.

Bunu yapmak için aşağıdaki kullanabilirsiniz:

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

gibi bir uzatma yönteminde bu kaydırmak için daha iyi olurdu:

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

Yani kullanabilirsiniz:

+1

bu 'sl.FindAll (s => s.Contains ("Stat", StringComparison.OrdinalIgnoreCase)) o, o OP'ın söz konusu liste verildi demek olmaz TRUE? Her ne kadar doğru olsa da, 'List 'Listesinde ' Listesinde 'Listesinde bir İçerikleri tercih ederim. parametre. Yani ... 'dönüş target.IndexOf (değer, karşılaştırma)> = 0 && target.Length == value.Length;' – GCymbala

+0

+2 eğer yapabilirsem. Tam olarak neye ihtiyacım vardı –

-1

biri (en iyi olmayabilir), sen sl koymak dizeleri tüm küçük harfli olduğunu. Ardından searchKeyword öğesini küçük harfle işaretlersiniz.

Başka bir çözüm 2 dize parametreleri küçük harf ve en iyi seçenek sıralı harf duyarsız bir karşılaştırma kullanarak olurdu onlara

6

En uygun çözüm, karşılaştırmayı yaparken durumu görmezden gelmek olacaktır

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

kullanın Linq, bu yeni yöntem, yani muhtemelen

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

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

.compare için

using System.Linq; 
... 

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

Aha! StringComparison'ı yanlışlıkla kullanıyordum! Teşekkürler! –

+0

Sadece bir not: Bu işe yaramaz - bir metin senaryosunda bir kelimeyi arat çünkü içerdiği metin tam metni arar. Tabii ki bu soruda bir senaryo değildir ve cevabınız mükemmel çalışır. :) –

+1

@ Ankur-m muhtemelen bunun için bir Regex istiyorsun. Şimdi 2 problemin var. –

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

"indexOf kullanmak yerine daha iyi bir yaklaşımdır." neden tam olarak –

0

Bu bitince küçük bir hile uygulayabilirsiniz ekler.
Değişim tüm dize aynı durumda için: ya üst veya alt durumda

Liste searchResults = sl.FindAll (s =>s.ToUpper() .Contains (seachKeyword.ToUpper()));

0

LİSTE LİSTESİ üzerinden arama yapmakta zorlananlarınız için bir çözüm buldum.

Bu örnekte bir Jagged List olarak arama yapıyorum ve yalnızca argümanla eşleşen ilk dizgiye sahip Listeleri yakalarım.

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

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

DoSomething(TEMPList); 
0

FindAll tüm listeyi numaralandırır. İlk örneği bulduktan sonra kırmak daha iyi bir yaklaşım olacaktır.

bool found = list.FirstOrDefault (x => String.Equals (x, searchKeyWord, Stringcomparison.OrdinalIgnoreCase)!= boş; sizin gerekli anahtar kelimeyi arar yöntemle Aşağıda

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

Sen şöyle küçük harf duyarsız dize eşitlik karşılaştırıcısı sağlayarak Contains kullanmak CAN.

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>(); 

dönüş Yeni liste; ` ` dönecekti; }

+0

Not linq "using using System.Linq;" –

+0

Bu en basit cevaptır ve iyi çalışır. –

+0

Bu gerçek cevap –

0

ve insert tüm yeni liste halinde öğeleri aradı ve sonra yeni bir liste döndürür:

+1

Kodunuzun açıklamasını eklemek daha iyi olurdu. –

+0

"ListOfitems" listenizdir. searchText, aranacak anahtar kelimedir. Yaptığım bir hata, iki kez küçük harf yapıyor. onun iki kez gerekli değildir. –