How to search a Substring in String array in C#

2019-02-17 14:20发布

问题:

How to search for a Substring in String array? I need to search for a Substring in the string array. The string can be located in any part of the array (element) or within an element. (middle of a string) I have tried : Array.IndexOf(arrayStrings,searchItem) but searchItem has to be the EXACT match to be found in arrayStrings. In my case searchItem is a portion of a complete element in arrayStrings.

string [] arrayStrings = {
   "Welcome to SanJose",
   "Welcome to San Fancisco","Welcome to New York", 
   "Welcome to Orlando", "Welcome to San Martin",
   "This string has Welcome to San in the middle of it" 
};
lineVar = "Welcome to San"
int index1 = 
   Array.IndexOf(arrayStrings, lineVar, 0, arrayStrings.Length);
// index1 mostly has a value of -1; string not found

I need to check whether lineVar variable is present in arrayStrings. lineVar can be of different length and value.

What would be the best way to find this substring within an array string?

回答1:

If all you need is a bool true/false answer as to whether the lineVar exists in any of the strings in the array, use this:

 arrayStrings.Any(s => s.Contains(lineVar));

If you need an index, that's a bit trickier, as it can occur in multiple items of the array. If you aren't looking for a bool, can you explain what you need?



回答2:

Old school:

int index = -1;

for(int i = 0; i < arrayStrings.Length; i++){
   if(arrayStrings[i].Contains(lineVar)){
      index = i;
      break;
   }
}

If you need all the indexes:

List<Tuple<int, int>> indexes = new List<Tuple<int, int>>();

for(int i = 0; i < arrayStrings.Length; i++){
   int index = arrayStrings[i].IndexOf(lineVar);
   if(index != -1)
     indexes.Add(new Tuple<int, int>(i, index)); //where "i" is the index of the string, while "index" is the index of the substring
}


回答3:

If you need the Index of the first element that contains the substring in the array elements, you can do this...

int index = Array.FindIndex(arrayStrings, s => s.StartsWith(lineVar, StringComparison.OrdinalIgnoreCase)) // Use 'Ordinal' if you want to use the Case Checking.

If you need the element's value that contains the substring, just use the array with the index you just got, like this...

string fullString = arrayStrings[index];

Note: The above code will find the first occurrence of the match. Similary, you can use Array.FindLastIndex() method if you want the last element in the array that contains the substring.

You will need to convert the array to a List<string> and then use the ForEach extension method along with Lambda expressions to get each element that contains the substring.