简体   繁体   中英

C# Array of strings contains string part from another array of strings

Is there a way using LINQ, to find if string from one array of strings contains (partial) string from another array of strings? Something like this:

string[] fullStrings = { "full_xxx_part_name", "full_ccc_part_name", "full_zzz_part_name" };
string[] stringParts = { "a_part", "b_part", "c_part", "e_part" }; 

// compare fullStrings array with stringParts array
// full_ccc_part_name contains c_part (first match is OK, no need to find all)
// return index 1 (index 1 from fullStrings array)

This is asked rather for educational purpose. I'm aware that Linq does not magically avoid the loop, instead does it in the background.

You can use Where + Any with string methods:

string[] matches = fullStrings
     .Where(s => stringParts.Any(s.Contains))
     .ToArray();

If you want to compare in a case insensitive way use IndexOf :

string[] matches = fullStrings
     .Where(s => stringParts.Any(part => s.IndexOf(part, StringComparison.OrdinalIgnoreCase) >= 0))
     .ToArray();

In case you want the indexes:

int[] matches = fullStrings 
     .Select((s, index) => (String: s, Index: index))
     .Where(x => stringParts.Any(x.String.Contains))
     .Select(x => x.Index)
     .ToArray();

You would of course need to use some type of loop to find the index. Here is a solution using Linq. This will return the first index if a match is found or -1 if none is found:

var index = fullStrings
              .Select((s,i) => (s, i))
              .Where(x => stringParts.Any(x.s.Contains))
              .Select(x => x.i)
              .DefaultIfEmpty(-1)
              .First();

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM