Come verificare se una parola nella mia lista contiene nel testo

Ho un

List words = new List {"word1", "word2", "word3"}; 

E voglio controllare usando linq se la mia stringa contiene QUALSIASI di queste parole; Smthng come:

 var q = myText.ContainsAny(words); 

E il secondo, se ho anche una lista di frasi:

 List sentences = new List { "sentence1 word1" , "sentence2 word2" , "sentence3 word3"}; 

e anche neet controllare se qualcuno di questi termini contiene una di queste parole!

  var q = sentences.Where(s=>words.Any(s.text)).... 

È ansible utilizzare una query LINQ semplice, se tutto ciò che serve è controllare le sottostringhe:

 var q = words.Any(w => myText.Contains(w)); // returns true if myText == "This password1 is weak"; 

Se vuoi verificare la presenza di parole intere, puoi usare un’espressione regolare:

  1. Corrispondenza con un’espressione regolare che è la disgiunzione di tutte le parole:

     // you may need to call ToArray if you're not on .NET 4 var escapedWords = words.Select(w => @"\b" + Regex.Escape(w) + @"\b"); // the following line builds a regex similar to: (word1)|(word2)|(word3) var pattern = new Regex("(" + string.Join(")|(", escapedWords) + ")"); var q = pattern.IsMatch(myText); 
  2. Dividere la stringa in parole con un’espressione regolare e testare l’appartenenza alla raccolta di parole (che diventerà più veloce se si utilizzano le parole HashSet in un HashSet anziché in un List ):

     var pattern = new Regex(@"\W"); var q = pattern.Split(myText).Any(w => words.Contains(w)); 

Per filtrare una raccolta di frasi in base a questo criterio, tutto ciò che devi fare è metterlo in una funzione e chiamare Where :

  // Given: // bool HasThoseWords(string sentence) { blah } var q = sentences.Where(HasThoseWords); 

O mettilo in un lambda:

  var q = sentences.Where(s => Regex.Split(myText, @"\W").Any(w => words.Contains(w))); 
 var q = words.Any(w => myText.Contains(w)); 

Per restituire tutte le frasi che contengono 1 o più parole:

 var t = sentences.Where(s => words.Any(w => s.Contains(w))); foreach (var sentence in t) { Console.WriteLine(sentence); } 

Mentre la maggior parte delle soluzioni presentate sono funzionali (tutte le chiamate Contains , che ti daranno la soluzione desiderata), se la lista e il testo sono grandi, potresti avere problemi di prestazioni.

Dal problema che ho affermato, penserei che si chiami una parola qualsiasi cosa tra spazi o qualsiasi altro divisore. Quindi, ti consiglio di dividere il tuo myText in un elenco di parole e confrontare ciascuna di esse con l’elenco di parole, che ora contiene.

È molto più complesso, naturalmente; Dovresti assicurarti che le parole divise siano corrette, ma con stringhe più grandi (ad esempio un file di testo) potrebbero esserci dei guadagni in termini di prestazioni.

Per la tua prima condizione

 List words = new List { "word1", "word2", "word3" }; string test = "word1"; bool isFound = words.Contains(test); 

Per la tua seconda condizione

 bool isFound = sentences.Any(x => x.Split(new char[] { ' ' }).Contains(test)); 

Come una nota secondaria non correlata

Stai modificando l’ambito della domanda dopo aver ricevuto alcune risposte e questo non è un buon modo per fare domande. 🙂