Reputation: 6792
I want to use C# to check if a string
value contains a word in a string
array.
For example:
string stringToCheck = "text1text2text3";
string[] stringArray = { "text1", "someothertext" };
if (stringToCheck.Contains(stringArray)) // Is one of the items?
{
}
How can I check if the string
value for stringToCheck
contains a word in the array?
Upvotes: 386
Views: 855487
Reputation: 31
string word = "XRC"; // Try also with word = null;
string[] myWords = { "CUS", "CT", "NMS", "RX", "RUS", "VUS", "XRC", null };
if (myWords.Contains(word))
Console.WriteLine("1. if: contains the string");
if (myWords.Any(word.Contains))
Console.WriteLine("2. if: contains the string, but null elements throws an exception");
if (myWords.Any(x => x.Equals(word)))
Console.WriteLine("3. if: contains the string, but null elements throws an exception ");
Upvotes: 1
Reputation: 1499
LINQ:
arrray.Any(x => word.Equals(x));
This is to see if array contains the word (exact match). Use .Contains for the substring, or whatever other logic you may need to apply instead.
Upvotes: 2
Reputation: 1126
Most of those solutions are correct, but if you need to check values without case sensitivity:
using System.Linq;
...
string stringToCheck = "text1text2text3";
string[] stringArray = { "text1", "someothertext"};
if(stringArray.Any(a=> String.Equals(a, stringToCheck, StringComparison.InvariantCultureIgnoreCase)) )
{
//contains
}
if (stringArray.Any(w=> w.IndexOf(stringToCheck, StringComparison.InvariantCultureIgnoreCase)>=0))
{
//contains
}
Upvotes: 2
Reputation: 319
To complete the previous answers, for the IgnoreCase check, use:
stringArray.Any(s => stringToCheck.IndexOf(s, StringComparison.CurrentCultureIgnoreCase) > -1)
Upvotes: 1
Reputation: 1664
Try this. There isn't any need for a loop..
string stringToCheck = "text1";
List<string> stringList = new List<string>() { "text1", "someothertext", "etc.." };
if (stringList.Exists(o => stringToCheck.Contains(o)))
{
}
Upvotes: -1
Reputation: 4460
⚠️ Note: this does not answer the question asked |
---|
The question asked is "how can I check if a sentence contains any word from a list of words?" |
This answer checks if a list of words contains one particular word |
The easiest and simplest way:
bool bol = Array.Exists(stringarray, E => E == stringtocheck);
Upvotes: 10
Reputation: 7
A simple solution that does not require any LINQ:
String.Join(",", array).Contains(Value + ",");
Upvotes: -1
Reputation: 37566
⚠️ Note: this does not answer the question asked |
---|
The question asked is "how can I check if a sentence contains any word from a list of words?" |
This answer checks if a list of words contains one particular word |
I would use LINQ, but it still can be done through:
new[] {"text1", "text2", "etc"}.Contains(ItemToFind);
Upvotes: 1
Reputation: 701
⚠️ Note: this does not answer the question asked |
---|
The question asked is "how can I check if a sentence contains any word from a list of words?" |
This answer checks if a list of words contains one particular word |
Just use the LINQ method:
stringArray.Contains(stringToCheck)
Upvotes: 52
Reputation: 1513
string [] lines = {"text1", "text2", "etc"};
bool bFound = lines.Any(x => x == "Your string to be searched");
bFound is set to true if the searched string is matched with any element of array 'lines'.
Upvotes: 0
Reputation: 7537
I used a similar method to the IndexOf by Maitrey684 and the foreach loop of Theomax to create this. (Note: the first 3 "string" lines are just an example of how you could create an array and get it into the proper format).
If you want to compare 2 arrays, they will be semi-colon delimited, but the last value won't have one after it. If you append a semi-colon to the string form of the array (i.e. a;b;c becomes a;b;c;), you can match using "x;" no matter what position it is in:
bool found = false;
string someString = "a-b-c";
string[] arrString = someString.Split('-');
string myStringArray = arrString.ToString() + ";";
foreach (string s in otherArray)
{
if (myStringArray.IndexOf(s + ";") != -1) {
found = true;
break;
}
}
if (found == true) {
// ....
}
Upvotes: 1
Reputation: 148
For my case, the above answers did not work. I was checking for a string in an array and assigning it to a boolean value. I modified Anton Gogolev's answer and removed the Any()
method and put the stringToCheck
inside the Contains()
method.
bool isContain = stringArray.Contains(stringToCheck);
Upvotes: 1
Reputation: 12561
You can also do the same thing as Anton Gogolev suggests to check if any item in stringArray1
matches any item in stringArray2
:
using System.Linq;
if(stringArray1.Any(stringArray2.Contains))
And likewise all items in stringArray1 match all items in stringArray2:
using System.Linq;
if(stringArray1.All(stringArray2.Contains))
Upvotes: 1
Reputation: 677
Using LINQ and a method group would be the quickest and more compact way of doing this.
var arrayA = new[] {"element1", "element2"};
var arrayB = new[] {"element2", "element3"};
if (arrayB.Any(arrayA.Contains))
return true;
Upvotes: 3
Reputation: 7
Try this. Example: To check if the field contains any of the words in the array. To check if the field (someField) contains any of the words in the array.
String[] val = { "helloword1", "orange", "grape", "pear" };
Expression<Func<Item, bool>> someFieldFilter = i => true;
someFieldFilter = i => val.Any(s => i.someField.Contains(s));
Upvotes: -1
Reputation: 19353
Here is how you can do it:
string stringToCheck = "text1";
string[] stringArray = { "text1", "testtest", "test1test2", "test2text1" };
foreach (string x in stringArray)
{
if (stringToCheck.Contains(x))
{
// Process...
}
}
Maybe you are looking for a better solution... Refer to Anton Gogolev's answer which makes use of LINQ.
Upvotes: 184
Reputation: 7768
⚠️ Note: this does not answer the question asked |
---|
The question asked is "how can I check if a sentence contains any word from a list of words?" |
This answer checks if a list of words contains one particular word |
I use the following in a console application to check for arguments
var sendmail = args.Any( o => o.ToLower() == "/sendmail=true");
Upvotes: 0
Reputation: 55
⚠️ Note: this does not answer the question asked |
---|
The question asked is "how can I check if a sentence contains any word from a list of words?" |
This answer checks if a list of words contains one particular word |
stringArray.ToList().Contains(stringToCheck)
Upvotes: 3
Reputation: 115
⚠️ Note: this does not answer the question asked |
---|
The question asked is "how can I check if a sentence contains any word from a list of words?" |
This answer checks if a list of words contains one particular word |
string strName = "vernie";
string[] strNamesArray = { "roger", "vernie", "joel" };
if (strNamesArray.Any(x => x == strName))
{
// do some action here if true...
}
Upvotes: 8
Reputation: 782
⚠️ Note: this does not answer the question asked |
---|
The question asked is "how can I check if a sentence contains any word from a list of words?" |
This answer checks if a list of words contains one particular word |
No need to use LINQ
if (Array.IndexOf(array, Value) >= 0)
{
//Your stuff goes here
}
Upvotes: 54
Reputation: 115691
Here's how:
using System.Linq;
if(stringArray.Any(stringToCheck.Contains))
/* or a bit longer: (stringArray.Any(s => stringToCheck.Contains(s))) */
This checks if stringToCheck
contains any one of substrings from stringArray
. If you want to ensure that it contains all the substrings, change Any
to All
:
if(stringArray.All(stringToCheck.Contains))
Upvotes: 996
Reputation: 312
You can try this solution as well.
string[] nonSupportedExt = { ".3gp", ".avi", ".opus", ".wma", ".wav", ".m4a", ".ac3", ".aac", ".aiff" };
bool valid = Array.Exists(nonSupportedExt,E => E == ".Aac".ToLower());
Upvotes: 1
Reputation: 6090
Using Find or FindIndex methods of the Array class:
if(Array.Find(stringArray, stringToCheck.Contains) != null)
{
}
if(Array.FindIndex(stringArray, stringToCheck.Contains) != -1)
{
}
Upvotes: 1
Reputation: 12264
You can define your own string.ContainsAny()
and string.ContainsAll()
methods. As a bonus, I've even thrown in a string.Contains()
method that allows for case-insensitive comparison, etc.
public static class Extensions
{
public static bool Contains(this string source, string value, StringComparison comp)
{
return source.IndexOf(value, comp) > -1;
}
public static bool ContainsAny(this string source, IEnumerable<string> values, StringComparison comp = StringComparison.CurrentCulture)
{
return values.Any(value => source.Contains(value, comp));
}
public static bool ContainsAll(this string source, IEnumerable<string> values, StringComparison comp = StringComparison.CurrentCulture)
{
return values.All(value => source.Contains(value, comp));
}
}
You can test these with the following code:
public static void TestExtensions()
{
string[] searchTerms = { "FOO", "BAR" };
string[] documents = {
"Hello foo bar",
"Hello foo",
"Hello"
};
foreach (var document in documents)
{
Console.WriteLine("Testing: {0}", document);
Console.WriteLine("ContainsAny: {0}", document.ContainsAny(searchTerms, StringComparison.OrdinalIgnoreCase));
Console.WriteLine("ContainsAll: {0}", document.ContainsAll(searchTerms, StringComparison.OrdinalIgnoreCase));
Console.WriteLine();
}
}
Upvotes: 4
Reputation: 923
Three options demonstrated. I prefer to find the third as the most concise.
class Program {
static void Main(string[] args) {
string req = "PUT";
if ((new string[] {"PUT", "POST"}).Any(s => req.Contains(s))) {
Console.WriteLine("one.1.A"); // IS TRUE
}
req = "XPUT";
if ((new string[] {"PUT", "POST"}).Any(s => req.Contains(s))) {
Console.WriteLine("one.1.B"); // IS TRUE
}
req = "PUTX";
if ((new string[] {"PUT", "POST"}).Any(s => req.Contains(s))) {
Console.WriteLine("one.1.C"); // IS TRUE
}
req = "UT";
if ((new string[] {"PUT", "POST"}).Any(s => req.Contains(s))) {
Console.WriteLine("one.1.D"); // false
}
req = "PU";
if ((new string[] {"PUT", "POST"}).Any(s => req.Contains(s))) {
Console.WriteLine("one.1.E"); // false
}
req = "POST";
if ((new string[] {"PUT", "POST"}).Any(s => req.Contains(s))) {
Console.WriteLine("two.1.A"); // IS TRUE
}
req = "ASD";
if ((new string[] {"PUT", "POST"}).Any(s => req.Contains(s))) {
Console.WriteLine("three.1.A"); // false
}
Console.WriteLine("-----");
req = "PUT";
if (Array.IndexOf((new string[] {"PUT", "POST"}), req) >= 0) {
Console.WriteLine("one.2.A"); // IS TRUE
}
req = "XPUT";
if (Array.IndexOf((new string[] {"PUT", "POST"}), req) >= 0) {
Console.WriteLine("one.2.B"); // false
}
req = "PUTX";
if (Array.IndexOf((new string[] {"PUT", "POST"}), req) >= 0) {
Console.WriteLine("one.2.C"); // false
}
req = "UT";
if (Array.IndexOf((new string[] {"PUT", "POST"}), req) >= 0) {
Console.WriteLine("one.2.D"); // false
}
req = "PU";
if (Array.IndexOf((new string[] {"PUT", "POST"}), req) >= 0) {
Console.WriteLine("one.2.E"); // false
}
req = "POST";
if (Array.IndexOf((new string[] {"PUT", "POST"}), req) >= 0) {
Console.WriteLine("two.2.A"); // IS TRUE
}
req = "ASD";
if (Array.IndexOf((new string[] {"PUT", "POST"}), req) >= 0) {
Console.WriteLine("three.2.A"); // false
}
Console.WriteLine("-----");
req = "PUT";
if ((new string[] {"PUT", "POST"}.Contains(req))) {
Console.WriteLine("one.3.A"); // IS TRUE
}
req = "XPUT";
if ((new string[] {"PUT", "POST"}.Contains(req))) {
Console.WriteLine("one.3.B"); // false
}
req = "PUTX";
if ((new string[] {"PUT", "POST"}.Contains(req))) {
Console.WriteLine("one.3.C"); // false
}
req = "UT";
if ((new string[] {"PUT", "POST"}.Contains(req))) {
Console.WriteLine("one.3.D"); // false
}
req = "PU";
if ((new string[] {"PUT", "POST"}.Contains(req))) {
Console.WriteLine("one.3.E"); // false
}
req = "POST";
if ((new string[] {"PUT", "POST"}.Contains(req))) {
Console.WriteLine("two.3.A"); // IS TRUE
}
req = "ASD";
if ((new string[] {"PUT", "POST"}.Contains(req))) {
Console.WriteLine("three.3.A"); // false
}
Console.ReadKey();
}
}
Upvotes: -3
Reputation: 416
int result = Array.BinarySearch(list.ToArray(), typedString, StringComparer.OrdinalIgnoreCase);
Upvotes: -1
Reputation: 4604
If stringArray
contains a large number of varied length strings, consider using a Trie to store and search the string array.
public static class Extensions
{
public static bool ContainsAny(this string stringToCheck, IEnumerable<string> stringArray)
{
Trie trie = new Trie(stringArray);
for (int i = 0; i < stringToCheck.Length; ++i)
{
if (trie.MatchesPrefix(stringToCheck.Substring(i)))
{
return true;
}
}
return false;
}
}
Here is the implementation of the Trie
class
public class Trie
{
public Trie(IEnumerable<string> words)
{
Root = new Node { Letter = '\0' };
foreach (string word in words)
{
this.Insert(word);
}
}
public bool MatchesPrefix(string sentence)
{
if (sentence == null)
{
return false;
}
Node current = Root;
foreach (char letter in sentence)
{
if (current.Links.ContainsKey(letter))
{
current = current.Links[letter];
if (current.IsWord)
{
return true;
}
}
else
{
return false;
}
}
return false;
}
private void Insert(string word)
{
if (word == null)
{
throw new ArgumentNullException();
}
Node current = Root;
foreach (char letter in word)
{
if (current.Links.ContainsKey(letter))
{
current = current.Links[letter];
}
else
{
Node newNode = new Node { Letter = letter };
current.Links.Add(letter, newNode);
current = newNode;
}
}
current.IsWord = true;
}
private class Node
{
public char Letter;
public SortedList<char, Node> Links = new SortedList<char, Node>();
public bool IsWord;
}
private Node Root;
}
If all strings in stringArray
have the same length, you will be better off just using a HashSet
instead of a Trie
public static bool ContainsAny(this string stringToCheck, IEnumerable<string> stringArray)
{
int stringLength = stringArray.First().Length;
HashSet<string> stringSet = new HashSet<string>(stringArray);
for (int i = 0; i < stringToCheck.Length - stringLength; ++i)
{
if (stringSet.Contains(stringToCheck.Substring(i, stringLength)))
{
return true;
}
}
return false;
}
Upvotes: 3
Reputation: 1
Try this
string stringToCheck = "text1text2text3";
string[] stringArray = new string[] { "text1" };
var t = lines.ToList().Find(c => c.Contains(stringToCheck));
It will return you the line with the first incidence of the text that you are looking for.
Upvotes: -1
Reputation: 1
public bool ContainAnyOf(string word, string[] array)
{
for (int i = 0; i < array.Length; i++)
{
if (word.Contains(array[i]))
{
return true;
}
}
return false;
}
Upvotes: -1
Reputation: 340
Try:
String[] val = { "helloword1", "orange", "grape", "pear" };
String sep = "";
string stringToCheck = "word1";
bool match = String.Join(sep,val).Contains(stringToCheck);
bool anothermatch = val.Any(s => s.Contains(stringToCheck));
Upvotes: 0