#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()
.