2013-04-16 25 views
11

Dize 2 sözcük veya daha fazlasını içeriyorsa, içerme işlevinin bulunmasını sağlamak mümkün mü? Bunu çalıştırdığınızdaDize, başka bir iki dize içeriyor

string d = "You hit someone for 50 damage"; 
string a = "damage"; 
string b = "someone"; 
string c = "you"; 

if(d.Contains(b + a)) 
{ 
    Console.WriteLine(" " + d); 
    Console.ReadLine(); 
} 

, konsol penceresi sadece bir şey göstermeden çok hızlı kapatır: Bu benim yapmaya çalıştığım şey bu.

Ve başka bir soru: Eğer bir tanesi ne kadar hasar verildiğini eklemek isterse, bu numarayı almanın ve TryParse içine almanın en kolay yolu ne olurdu?

+4

'if (d.Contains (a) && d.Contains (b))' –

+1

Sen eğer döngü dışında Console.ReadLine() tutmalı. –

+1

"b" ve "a" karakter dizgilerini birleştiriyorsunuz, bu yüzden esasen yazıyorsunuz, eğer if (d.Contains ("someonedamage")) 'hangi işe yaramayacak. If ifadeniz başarısız olur ve bu nedenle Console.ReadLine() 'a basmaz. Cidden, bu * son derece * basit hata ayıklama, lütfen kodunuzu nasıl değiştireceğinizi öğrenin. – tnw

cevap

34

Contains numaralı telefonu arayarak veya işlemek için kendi uzantı yönteminizi kullanmanız daha iyi olur.

string d = "You hit someone for 50 damage"; 
string a = "damage"; 
string b = "someone"; 
string c = "you"; 

if(d.Contains(a) && d.Contains(b)) 
{ 
    Console.WriteLine(" " + d); 
    Console.ReadLine(); 
} 

Bildiğim kadarıyla diğer soru olarak, sadece bir alana göre yarılmış, dize her zaman aynı ise 50 bulabilir veya dize ayrıştırmak için normal bir ifade oluşturmak ve 5. bölümünü alabilir.

+1

Ah neden bunu düşünmedim, teşekkürler! :) – Winkz

+0

Hmm, neden her satırda 5. noktasında değilse? – Winkz

+0

Aynı noktada değilse, o zaman işe yaramaz.Bunun yerine düzenli bir ifade yapmak isteyeceksiniz. \ d *, yukarıdaki örnek için çalışacak olan bir dizede tüm rakamları alacaktır. –

1

ddeğilb + a (yani "someonedamage") içermeyen ve (sizin Console.ReadLine();if blok içinde olduğundan) bu nedenle uygulama sadece sonlandırır olmasıdır. olduğu

6

çünkü d b + a yani "someonedamage"

1

b + a ="someonedamage" Çünkü bunu başarmak için deneyin içermediği ifadeleri yanlış dönerse:

if (d.Contains(b) && d.Contains(a)) 
{ 
    Console.WriteLine(" " + d); 
    Console.ReadLine(); 
} 
1

Sizin b + a"someonedamage" eşittir, d bu dize içermediğinden, if ifadeniz false döndürür ve aşağıdaki bölümleri çalıştırmaz.

Console.WriteLine(" " + d); 
Console.ReadLine(); 

Bunu daha verimli bir şekilde kontrol edebilirsiniz;

bool b = d.Contains(a) && d.Contains(b); 

İşte bir DEMO. "Sen 50 zarar için birilerini" olmadığını kontrol kodu d.Contains(b + a) ile

1
string d = "You hit someone for 50 damage"; 
string a = "damage"; 
string b = "someone"; 
string c = "you"; 

if(d.Contains(a) && d.Contains(b)) 
{ 
    Console.WriteLine(" " + d); 
} 
Console.ReadLine(); 
1

"someonedamage" içerir. Ve bu (sanırım) istemiyorsun.

+, b ve a.

Sen

if(d.Contains(b) && d.Contains(a)) 
1

Yani bir dize diğer iki dizeleri içeriyorsa bilmek istiyorum bunu kontrol etmek zorunda?Ayrıca karşılaştırma belirlemenizi sağlar bu uzantıyı kullanabilirsiniz

:

public static bool ContainsAll(this string text, StringComparison comparison = StringComparison.CurrentCulture, params string[]parts) 
{ 
    return parts.All(p => text.IndexOf(p, comparison) > -1); 
} 

bu şekilde kullanın (ayrıca atlayabilirsiniz StringComparison):

bool containsAll = d.ContainsAll(StringComparison.OrdinalIgnoreCase, a, b); 
1

Eğer bir listesi varsa Bu gibi bir yöntem yapabilirsiniz:

public bool ContainWords(List<string> wordList, string text) 
{ 
    foreach(string currentWord in wordList) 
     if(!text.Contains(currentWord)) 
     return false; 
    return true; 
} 
1

Bir uzantı yazabilirsiniz linq yöntemiyle.

public static bool MyContains(this string str, params string[] p) { 
return !p.Cast<string>().Where(s => !str.Contains(s)).Any(); 
} 

DÜZENLEME (Sirid thx):

public static bool MyContains(this string str, params string[] p) { 
return !p.Any(s => !str.Contains(s)); 
} 
+2

"Cast ()" gereksizdir. Herhangi bir() 'bir filtre argümanını alabildiğinden,' Where() 've' Any() 'da birleştirebilirsiniz. – siride

7
public static class StringExtensions 
{ 
    public static bool Contains(this string s, params string[] predicates) 
    { 
     return predicates.All(s.Contains); 
    } 
} 

string d = "You hit someone for 50 damage"; 
string a = "damage"; 
string b = "someone"; 
string c = "you"; 

if (d.Contains(a, b)) 
{ 
    Console.WriteLine("d contains a and b"); 
} 
+1

@AluanHaddad İyi nokta. Cevabımı güncelledi. – Romoku

3

sen dize arıyorsunuz kelimelerin belirli sayıda içeren veya belirli kelime içeriyor? Örneğiniz ikincisine doğru yöneliyor. Bu durumda, ayrıştırma dizelerine bakmak veya en azından normal ifadeyi kullanmak isteyebilirsiniz.
Regex'i öğrenin - programlamada 1000x üzerinde yararlı olacaktır. Bunu çok fazla vurgulayamıyorum. İçerikleri kullanmak içerir ve ifadeler çok hızlı bir şekilde karışıklığa dönüşür.

sadece, sonra kelimeleri saymak çalışıyorsanız: string 2 veya daha fazla kelime olup olmadığını kontrol etmek içeriyor içinde sadece bir alan için kontrol

string d = "You hit someone for 50 damage"; 
string[] words = d.Split(' '); // Break up the string into words 
Console.Write(words.Length); 
0

.

string d = "You hit someone for 50 damage"; 
string a = "damage"; 
string b = "someone"; 
string c = "you"; 

bool a = ?(d.contains(" ")):true:false; 

if(a) 
{ 
Console.WriteLine(" " + d); 
} 

Console.Read(); 
0
string d = "You hit ssomeones for 50 damage"; 
string a = "damage"; 
string b = "someone"; 

if (d.Contains(a) && d.Contains(b)) 
{ 
    Response.Write(" " + d); 

} 
else 
{ 
    Response.Write("The required string not contain in d"); 
} 
0

Peki gerçekten sonra olmasıdır? Bir şeyin (bu durumda) hasar isabet emin olmak için, neden Bu şekilde string.Format

string a = string.Format("You hit someone for {d} damage", damage); 

kullanarak değil, sen aradığınız hasar eleme var yeteneğine sahip ve diğer bölümler için bunu hesaplayabilir.

0
class Program { 
      static void Main(String[] args) { 
      // By using extension methods 
      if ("Hello world".ContainsAll(StringComparison.CurrentCultureIgnoreCase, "Hello", "world")) 
       Console.WriteLine("Found everything by using an extension method!"); 
      else 
       Console.WriteLine("I didn't"); 

      // By using a single method 
      if (ContainsAll("Hello world", StringComparison.CurrentCultureIgnoreCase, "Hello", "world")) 
       Console.WriteLine("Found everything by using an ad hoc procedure!"); 
      else 
       Console.WriteLine("I didn't"); 

      } 

      private static Boolean ContainsAll(String str, StringComparison comparisonType, params String[] values) { 
      return values.All(s => s.Equals(s, comparisonType)); 
      }  
     } 

     // Extension method for your convinience 
     internal static class Extensiones { 
      public static Boolean ContainsAll(this String str, StringComparison comparisonType, params String[] values) { 
      return values.All(s => s.Equals(s, comparisonType)); 
      } 
     } 
0
public static bool In(this string str, params string[] p) 
    { 
     foreach (var s in p) 
     { 
      if (str.Contains(s)) return true; 
     } 
     return false; 
    } 
+0

Birisi genellikle kişinin cevabına bir açıklama ifadesi eklemelidir. – mkl