Проверьте, содержит ли список строк какие-либо подстроки из другого списка строк

#linq

#linq

Вопрос:

Существуют похожие вопросы о том, как проверить, содержит ли строка какие-либо входные данные в списке, но я не понимаю, как это сделать для двух списков строк.

Предположим, у меня есть первый список, содержащий:

 ["five", "four", "three", "two", "one"]
 

и иметь второй List<string> , содержащий:

 ["bathroom", "twelve", "thirteen", "fou"]
 

Я хочу посмотреть, совпадает ли какая-либо из «подстрок» в списке 2 со списком 1. Если какая-либо из подстрок в списке 2 найдена в списке 1 (т.Е. «fou»), это true, в противном случае, если совпадений с подстроками не найдено, это false.

Я бы предположил, что для этого будет использоваться linq, но я не уверен, как это сделать для двух списков строк.

Комментарии:

1. Это помогло бы поместить тег или упомянуть в вашем вопросе язык, который вы используете.

Ответ №1:

 var result = list1.Any(s1 => list2.Any(s2 => s1.Contains(s2)));
 

или, используя более сложный синтаксис

 var result = list1.Any(s1 => list2.Any(s1.Contains));
 

Ответ №2:

Если вы хотите иметь только bool result — если какой-либо string (скажем, "fou" ) внутри secondList содержится в любом элементе внутри firstList (скажем, four : fou r) — вы можете попробовать

   List<string> firstList = new List<string>() {
    "five", "four", "three", "two", "one",
  };

  List<string> secondList = new List<string>() {
    "bathroom", "twelve", "thirteen", "fou",
  };  

  ...

  bool result = secondList
    .Any(second => firstList.Any(first => first.Contains(second))); 
 

Ответ №3:

 var list1 = new List<string> { "five", "four", "three", "two", "one" };
var list2 = new List<string> { "bathroom", "twelve", "thirteen", "fou" };
var found = list1.Any(i1 => list2.Any(i2 => i1.Contains(i2)));
 

Редактировать

Основываясь на ваших комментариях, я понимаю, что у вас возникли проблемы с отладкой. Вы можете расширить приведенный выше код, как, например, ниже, чтобы он помог вам лучше понять, что делает код:

 var list1 = new List<string> { "five", "four", "three", "two", "one" };
var list2 = new List<string> {  "f", "o", "t" };
var found = list1.All(i1 =>
    { 
        var l1Result = list2.Any(i2 => 
            {
                var l2Reuslt = i1.Contains(i2);
                Console.WriteLine($"{i1} constains {i2}: {l2Reuslt}");
                return l2Reus<
            });
        Console.WriteLine($"{i1} Final : {l1Result}");
        return l1Resu<
    }
);
 

Комментарии:

1. Если бы вы вместо этого использовали All, вы бы просто заменили?

2. @Berek я не понимаю вашего вопроса.

3. @Berek попробуйте сами? 😉

4. Если вы замените оба any на All, то это означает, что весь список 1 должен содержать весь список 2. если вы выполните list1.All / list2. Любой означает, что для всего списка 1 требуется хотя бы один соответствующий элемент в списке 2…