2010-04-06 12 views
19

Bir yapılandırma dosyasından virgülle ayrılmış bir dizeler listesi okuyorum. Başka bir dizenin o listede olup olmadığını kontrol etmem gerekiyor..NET ile virgülle ayrılmış liste içinde dizgiyi kontrol etmenin en iyi yolu?

"apple,banana,cheese"

Ben "apple" için işaretlerseniz bunu bulmak gerekir ama "app" kontrol eğer Almamalıyım: Örneğin.

Bunu yapmanın en yalın ve özlü yolu nedir? Hızlı olmak zorunda değil.

(bir cevap olarak benim çözüm ekleyeceğiz, ama birinin daha iyi bir şey vardır umut ediyorum.)

cevap

37

kullanılması linq:

listString.Split(',').Contains("apple") 

W/O linq:

Array.IndexOf(listString.Split(','), "apple") >= 0 
+1

Anlamadım. String.Split bir dizi döndürür. Dizilerde bir İçerme yöntemi yok. –

+2

.NET3.5 + kullanıyor olmanız ve bir yere System.Linq kullanmanız gerekir. – nothrow

+1

Bir dizi için kullanılabilecek bir 'Contains' LINQ uzantısı yöntemi vardır. Net 1.1 veya 2.0 kullanıyorsanız, bu işe yaramaz olsa da. –

7

Regex muhtemelen "düz ileri" olarak sayılmaz, ama bu ne olduğunu ben var tabii:

Regex.IsMatch(listString, "(?<=,|^)" + testWord + "(?=,|$)") 

Güncelleme: aşağıdaki Başına Eric'in yorum, bu şekilde olmalıdır:

Regex.IsMatch(listString, "(?<=,|^)" + Regex.Escape(testWord) + "(?=,|$)") 
+3

olduğunu Burada büyük bir problemin var. –

+1

Whoah, bunu düşünmedim. İyi bir nokta! Sanırım bir regex-enjeksiyon saldırısına karşı savunmasızım! :) –

+0

Ne demek istiyorsun? Regexler kaya! –

10
(","+listString+",").Contains(","+testWord+","); 

fakat düz olarak da değil.

+1

Bu yöntemi her zaman kullanırdım. N yeni dizeleri oluşturmamanın erdemine sahiptir. – harpo

+3

Virgülle ayrılmış dizeniz uzunsa, bölünmekten daha fazla alan etkilidir. –

+1

.NET 2.0 için bunun en iyi çözüm olabileceğini düşünüyorum. Virgüllerin neden eklendiğini görmek çok zor değil ve sadece bir yöntem çağrısı. Bunu sevdim. –

3

diğer bir yolu kullanmayı denemek olabilir

bool contains = new List<string>("apple,banana,cheese".Split(',')).Contains("apple"); 
//or 
bool b = "apple,banana,cheese".Split(',').Contains("apple"); 

List< T>.Contains Method

String.Split Method

Enumerable.Contains Method

+0

Linq olmayan sürümü dahil ettiğiniz için teşekkürler. Çok kötü, o kadar parlak. –

+3

Array IList 'u uyguladığından, ikinci bir Liste oluşturmanız gerekmez. Aşağıdaki varyant, .NET 2.0 için çalışacaktır: ((IList ) listString.Split (',')). İçerir (...) – Joe

1

İşte harfe duyarlı bir seçenek.

var food = "apple,banana,cheese"; 

bool containsApp = food.Split(',') 
         .Where(s => string.Compare("app", s, true) == 0) 
         .Count() > 0; 

bool containsApple = food.Split(',') 
         .Where(s => string.Compare("apple", s, true) == 0) 
         .Count() > 0; 

Console.WriteLine("Contains \"app\"? {0}", containsApp); 
Console.WriteLine("Contains \"apple\"? {0}", containsApple); 
+0

Eğer linq kullanıyorsanız, o zaman IEnumerable .Compare' aşırı yüklenme gerektirir. bir "IEqualityComparer ". Kültürel duyarlı dizi karşılaştırmaları için – Lee

+0

+1! "Caf \ u00E9" ve "Cafe \ u0301" aynı görünüyorlar, eşit olarak karşılaştırmalılar! –

1

Yanıt, virgülle ayrılmış listeniz için sözdizimi kurallarının ne olduğuna bağlıdır.

kurallar listesi ardından görevi bileşen parçaları var içine bölünebilir (boşluk yok, en sondaki virgül) yayınlanmıştır tam olarak olmasını gerektiriyorsa:

dize apple, ile mi başlıyor? (String.StartsWith)
Dize ,apple ile bitiyor mu? (String.EndsWith)
Dize ,apple, içeriyor mu? (String.Contains)

Kurallar daha zorsa, Regex yaklaşımı listeyi tamamen işlemeden veya bir kural yığını yazmadan tek yol olur.

Aynı dizeye karşı birçok öğe denetliyorsanız, yalnızca dizeyi önbelleğe aldığınız bir listeye dönüştürmek ve ardından karşıdan denetlemek isteyeceksiniz. String.Split yöntemi sizin için bunu yapacaktır.

2

Bu çalışır, ancak karmaşıklaşırsa, normal ifadeler oldukça yavaştır. Bununla birlikte, sınır çapa sözcüğü, bu tür bir şeyi oldukça kolaylaştırır.

var foods = "apple,banana,cheese"; 

var match = Regex.Match(foods, @"\bapple\b"); 

if (match.Success) 
    Console.WriteLine(match.Value); 
+1

Oh, bu benim karmaşık göz atma çözümümün gerçekten aptalca görünmesini sağlıyor. Teşekkürler. –

0

Bu durumda ve kültürünü görmezden çözümü testWord sonra normal ifadede anlam taşıyan herhangi bir sembol içeriyorsa, (ya StringComparer mülkiyet birini seçin) Tabii

var commaDelimitedString = "string1,string2,string3,string4"; 
var testString = string2.trim; // trim to remove the spaces coz you may be getting it from UI 
if(commaDelimitedString.split(',').contains(testString,StringComparer.InvariantCultureIgnoreCase)) 
{ 
    //TODO: What to do when condition is true 
} 
else 
{ 
    //TODO: What to do when condition is false 
} 
0
    public bool GetIsExistSubstring(string mainstring, string substring) 
    {   
     bool Isexist=false; 
     int i = -1; 
     mainstring = string.Format(",{0},", mainstring);//so it will be like ,1,2,3, 
     substring = string.Format(",{0},", substring);//so it will be like ,1, 
     i=mainstring.IndexOf(substring); 

     if(i!=-1) 
     { 
      Isexist = true; 
     } 
     return Isexist; 
    } 
+0

Lütfen yeni soruları yanıtlamayı deneyin. Bu 2010 yılında soruldu ve ayrıca cevaplandı. –

İlgili konular