фильтрация списка внутри forEach с несколькими условиями

#c#

#c#

Вопрос:

Я создал метод c # для фильтрации списка учащихся на основе определенных условий.

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

Затем я создал еще один список filteredstudentsWithUnits для заполнения после применения фильтров filteredstudents

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

Может кто-нибудь предложить, потому что у меня будут дополнительные условия фильтрации, поэтому я действительно не хочу создавать несколько списков.

 private List<StudentDTO> _validateStudents(List<StudentDTO> students)
{   
    List<StudentDTO> filteredstudents = new List<StudentDTO>();
    foreach (StudentDTO student in students)
    {
        if (student.age != null amp;amp; student.status != "DEL")
            filteredstudents.Add(student);
        else
            _log("create log");
    }

    List<StudentDTO> filteredstudentsWithUnits = new List<StudentDTO>();
    foreach (StudentDTO student in filteredstudents)
    {
        bool valid = true;
        foreach (SubjectTypes subjectType in student.SubjectTypes)
        {
            string value1 = subjectType.SubjectItem.Select(x => x.value1).First();
            Guid StId = _context.Items.Where(x => x.Name == value1).FirstOrDefault();

            if (StId != null)
                valid = true;
            else
            {
                valid = false;
                _log("create log");
            }
        }
        if (valid)
            filteredstudentsWithUnits.Add(student);
    }
    return filteredstudentsWithUnits;
}
 

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

1. Linq — отличная вещь, вы должны это проверить

Ответ №1:

Если я правильно прочитал ваш код, вы могли бы использовать этот короткий запрос LINQ:

 List<StudentDTO> filteredstudentsWithUnits = students
    .Where(s => s.age != null amp;amp; s.status != "DEL")
    .Where(s => !_context.Items
        .Any(x => s.SubjectTypes
            .SelectMany(t => t.SubjectItem.Select(si => si.value1))
            .Contains(x.Name)))
    .ToList();
 

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

1. Это кажется действительно хорошей и короткой версией, но выдает только «Я потеряю ведение журнала для каждого условия, которое не удовлетворяет». В принципе, я хотел бы записать некоторую информацию для каждого условия, которое не удовлетворяет.

2. Взгляните на linq за исключением. Это даст вам тех, кто не выполняет условия, которые написал @Tim. Затем вы можете записать их в журнал.