2013-04-16 13 views
11

È possibile che la funzione di contenimento trovi se la stringa contiene 2 o più parole? Questo è quello che sto cercando di fare:La stringa contiene altre due stringhe

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

Quando eseguo questo, la finestra della console appena si spegne molto velocemente senza mostrare nulla.

E un'altra domanda: se per uno voglio aggiungere quanti danni sono stati fatti, quale sarebbe il modo più semplice per ottenere quel numero e inserirlo in un TryParse?

+4

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

+1

si dovrebbe tenere Console.ReadLine() al di fuori del caso ciclo. –

+1

Stai concatenando le stringhe 'b' e' a', quindi stai essenzialmente scrivendo 'if (d.Contains (" someonedamage "))' che non funzionerà. La tua if-statement fallisce e quindi non colpirà 'Console.ReadLine()'. Seriamente, questo è * estremamente * debug di base, per favore impara come fare il tuo codice. – tnw

risposta

34

Sarebbe meglio chiamare semplicemente Contains due volte o creare il proprio metodo di estensione per gestirlo.

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

Per quanto riguarda la tua domanda di altri, si potrebbe costruire un'espressione regolare per analizzare la stringa da trovare 50 o se la stringa è sempre lo stesso, basta dividerlo basa su uno spazio e ottenere la parte 5 °.

+1

Ah, perché non ci ho pensato, grazie! :) – Winkz

+0

Hmm perché se il numero non è al 5 ° posto in ogni riga? – Winkz

+0

Se non si trova nello stesso punto, non funzionerà.Invece vorrai fare un'espressione regolare. \ d * ti mostrerà tutte le cifre in una stringa, che funzionerà per il tuo esempio sopra. –

1

Questo perché d fa non contengono b + a (cioè "someonedamage"), e quindi l'applicazione termina appena (dal momento che il Console.ReadLine(); è all'interno del blocco if).

6

Questo è perché il if restituisce false in quanto d non contiene b + a "someonedamage" cioè

1

Perché b + a ="someonedamage", provate questo per raggiungere:

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

tuo b + a è uguale "someonedamage", poiché il tuo d non contiene quella stringa, l'istruzione if restituisce false e non esegue le seguenti parti.

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

È possibile controllare questo più efficiente come;

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

Ecco uno DEMO.

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

Con il codice d.Contains(b + a) si controlla se "Hai colpito qualcuno per 50 danni" contiene "someonedamage". E questo (credo) tu non vuoi.

Il + concats le due stringhe di b e a.

Devi controllare da

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

Così si vuole sapere se una stringa contiene altri due stringhe?

Si potrebbe utilizzare questa estensione che consente anche di specificare il confronto:

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

utilizzarlo in questo modo (si può anche omettere il StringComparison):

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

Se si dispone di un elenco di parole si può fare un metodo come questo:

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

Si potrebbe scrivere un'estensione metodo con linq.

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

EDIT (thx a Sirid):

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

Il 'Cast ()' non è necessario. Puoi anche combinare 'Where()' e 'Any()', poiché 'Any()' può accettare un argomento filtro. – 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 Buon punto. Aggiornato la mia risposta. – Romoku

3

Cercate la stringa contiene un certo numero di parole o contiene parole specifiche? Il tuo esempio conduce a quest'ultimo.

In tal caso, è possibile esaminare le stringhe di analisi o almeno utilizzare espressioni regolari.
Impara regex: sarà utile 1000x in programmazione. Non posso sottolineare troppo questo. Usare contiene e se le dichiarazioni si trasformeranno in un disastro molto rapidamente.

Se si sta solo cercando di contare le parole, poi:

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

Ho appena controllato per uno spazio in contiene per verificare se la stringa ha 2 o più parole.

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

Così che cosa è che siete veramente dopo? Se si vuole fare in modo che qualcosa ha colpito per danni (in questo caso), perché non sei utilizzando string.Format

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

In questo modo, si avrà la possibilità di avere il qualificatore danni che si sta cercando, e sono in grado di calcolarlo per altre parti.

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

Si dovrebbe in genere aggiungere alcune parole di spiegazione alla propria risposta. – mkl

Problemi correlati