#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…