LINQ: проверка, содержит ли строка (переменная) какие-либо из списка свойств

#c# #linq #linq-to-objects

#c# #linq #linq-to-objects

Вопрос:

Мне нужно проверить, содержит ли моя «константа» (строка) какие-либо элементы из моей коллекции. Моя константа здесь:

   studentTest = "MathsTest"; // THis is a constant that doesn't change,
                                  // it is set on frmLoad
  

Теперь мой linq требует, чтобы он проверял, содержит ли studentTest строку, которая есть в моих тестах (коллекции) со свойством Name.

Теперь studentTest всегда является «чем-то» с добавлением «Test» в конце, например, MathsTest, EnglishTest и т.д.

Мои тесты — это список «Test», каждый тест имеет свойство с именем «Name», которое содержит название теста за вычетом слова Test, т.е. английский, математика и т.д., А «НЕ» EnglishTest, MathsTest.

Итак, мне нужно проверить, содержит ли моя «константа» — какой-либо текст, который доступен в свойстве «Name» в каждом тесте.

Я пытался поиграть здесь, но я немного заблудился, и это неправильное направление.

      if ( test.Tests.Any(x => x.Type.Contains(studentTest)) )
  

Ответ №1:

Существует много способов решить эту проблему; один из подходов заключается в удалении суффикса «Test» из studentTest и поиске по нему:

 string type = studentTest.substring(0, studentTest.Length - 4);
if (test.Tests.Select(t => t.Type).Contains(type)) { ... }
  

или, если вы предпочитаете использовать Any() :

 if (test.Tests.Any(t => t.Type == type)) { ... }
  

На самом деле, показанный вами код был почти правильным, за исключением того, что, поскольку имя теста является подстрокой studentTest , оно должно было быть

 if (test.Tests.Any(x => studentTest.Contains(x.Type))) { ... }
  

Однако я бы рекомендовал использовать Substring() , потому что последний подход приведет к неправильным результатам, если один из типов теста действительно является "Test" (хотя в вашем случае это маловероятно)…

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

1. Да, но это не всегда может быть 4 символа или даже слово Test…. У меня есть идея, но мне нужно ее протестировать…. Я полагаю, что-то вроде этого сработало бы

2. если (тест. Тесты.Любые(x => studentTest.Содержит(x.Name ))) а может и нет?4

3. @Martin: А; судя по вашему вопросу, похоже, что все имена тестов будут заканчиваться точно на "Test" . Тогда Contains() должно сработать, но я бы предпочел StartsWith() .