Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 20.10.2019
Сообщений: 1

Фильтрация двух связанных списков по нескольким параметрам

20.10.2019, 16:08. Показов 2364. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Помогите пожалуйста.
Есть две коллекции: студенты и секции. Нужно вывести названия секций, которые открылись после 2000го года и в которых занимаются студенты только не достигшие 21го года. Если есть хотя бы один старше, то секция не должна выводиться.
По отдельности сортируется, но связать все в кучу не получается.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
 class Student
    {
        public string name;
        public int age;
        public List<string> stList;
        public Student (string a, int b, List<string> c)
        {
            this.name = a;
            this.age = b;
            this.stList = c;
        }
    }
    class Section
    {
        public string sectName;
        public int opened;
        public List<string> sectList;
        public Section(string a, int b, List<string> c)
        {
            this.sectName = a;
            this.opened = b;
            this.sectList = c;
        }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            List<Student> students = new List<Student>
           {
               new Student ("Jack", 22, new List<string> { "Basketball" }),
               new Student ("Sam", 21, new List<string> { "Basketball" }),               
               new Student ("Alex", 19, new List<string> { "Boxing", }),               
               new Student ("Oscar", 20, new List<string> { "Boxing" }),               
               new Student ("Harry", 23, new List<string> { "Boxing" }),
               new Student ("William", 18, new List<string> { "Tennis" })
           };           
            List<Section> sections = new List<Section>
            {              
                new Section ("Boxing", 2001, new List<string> { "Alex", "Oskar", "Harry" }),
                new Section ("Tennis", 2007, new List<string> { "William" }),
                new Section ("Basketball", 1998, new List<string> { "Jack", "Sam" }),
            };
 
            var select2 = from sect in sections
                          from stud in students
                          where sect.opened > 2000
                          where stud.age < 21
                          select sect;
            foreach (var x in select2)
            {
                Console.WriteLine($"{x.sectName} {x.opened}");
            }
        }
    }
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.10.2019, 16:08
Ответы с готовыми решениями:

Фильтрация по нескольким параметрам
Всем доброго времени суток. Кто знает как можно отфильтровать ADOTable по нескольким прараментам? Пытаюсь так: ...

Фильтрация по нескольким параметрам при обращении к БД
Есть база, но основании следующего кода: public class Auto { public int AutoId { get; set; } public string BrandName { get;...

Фильтрация datqagridView по нескольким параметрам, из нескольких столбцов
Здравствйте, собественно по названию понятен вопрос, есть таблица с 5 колноками и мне необходимо что бы производилась фильтрация по...

11
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
20.10.2019, 17:20
Лучший ответ Сообщение было отмечено hellowonderworl как решение

Решение

C#
1
2
3
4
5
6
7
8
9
10
11
12
var query = from section in sections
            where section.opened > 2000
            join studentSection in
            (from student in students
                from section in student.stList
                select (section, student))
                on section.sectName equals studentSection.section into participants
            where participants.All(s => s.student.age < 21)
            select section;
 
foreach (var section in query)
    Console.WriteLine(section.sectName);
Только это выборка, а не сортировка.
1
3566 / 2507 / 1174
Регистрация: 14.08.2016
Сообщений: 8,219
21.10.2019, 01:24
kolorotur, а как часто встречаются подобные весчи? код ТСа, ни разу ни ООП, объективно это работа сервера БиДэ
а если алексов 5 и джеков 7?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
21.10.2019, 09:54
Цитата Сообщение от Diamante Посмотреть сообщение
как часто встречаются подобные весчи?
Ну при работе с EF регулярно приходится такое писать.

Цитата Сообщение от Diamante Посмотреть сообщение
код ТСа, ни разу ни ООП, объективно это работа сервера БиДэ
Согласен.

Цитата Сообщение от Diamante Посмотреть сообщение
а если алексов 5 и джеков 7?
Ну тогда швах — откатываемся ко вьюхе или хранимке в базе
0
 Аватар для _katon_
414 / 265 / 25
Регистрация: 03.10.2011
Сообщений: 1,094
21.10.2019, 10:09
kolorotur, извиняюсь. Почему это не ООП?

Что-то не так со Student и Section?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
21.10.2019, 10:36
Цитата Сообщение от _katon_ Посмотреть сообщение
Почему это не ООП?
Потому что это суррогатный пример, который не делает ничего кроме демонстрации возможностей Linq.
Да от него другого и не требуется, собственно.

Цитата Сообщение от _katon_ Посмотреть сообщение
Что-то не так со Student и Section?
В рамках их использования в качестве примера — все в порядке, свою задачу они выполняют.
Если рассматривать код серьезно, то много чего не так: отсутствие инкапсуляции, поведения, композиция сделана через пень-колоду, наследование и полиморфизм отсутствуют в принципе. Можно еще к именам полей придраться.

Наличие классов — недостаточное условие, чтобы код назвать объектно-ориентированным. Этак и С можно назвать ОО-языком, т.к. там структуры есть.
0
 Аватар для _katon_
414 / 265 / 25
Регистрация: 03.10.2011
Сообщений: 1,094
21.10.2019, 11:13
Любая "архитектурная" ошибка в коде делает код не ООП?
Вот это ООП?:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    class Student
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public List<Section> Sections { get; set; }
        public Student(string Name, int Age, List<Section> Sections)
        {
            this.Name = Name;
            this.Age = Age;
            this.Sections = Sections;
        }
    }
    class Section
    {
        public string Name;
        public int Opened;
 
        public Section(string Name, int Opened)
        {
            this.Name = Name;
            this.Opened = Opened;
        }
    }
Я не слишком буквально понимаю "Это не ООП?" может надо это понимать как "не соответствует принципам ООП"?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16124 / 11248 / 2888
Регистрация: 21.04.2018
Сообщений: 33,080
Записей в блоге: 2
21.10.2019, 11:34
_katon_, в C# всё ООП. Даже просто простейший вывод строчки на консоль требует статического метода Main класса Program.
Другое дело, что можно игнорировать рекомендованные правила создания приложений, паттерны программирования и т.д.
Это не нарушит ООП, так как в C# его нарушить невозможно.
Но сильно осложнит создание кода, его понимание, читаемость и т.д, и т.п.
0
 Аватар для _katon_
414 / 265 / 25
Регистрация: 03.10.2011
Сообщений: 1,094
21.10.2019, 11:43
Цитата Сообщение от Элд Хасп Посмотреть сообщение
_katon_, в C# всё ООП. Даже просто простейший вывод строчки на консоль требует статического метода Main класса Program.
Другое дело, что можно игнорировать рекомендованные правила создания приложений, паттерны программирования и т.д.
Это не нарушит ООП, так как в C# его нарушить невозможно.
Но сильно осложнит создание кода, его понимание, читаемость и т.д, и т.п.
Я с вами согласен и именно поэтому "триггернулся" на
Цитата Сообщение от kolorotur Посмотреть сообщение
ни разу ни ООП
C# ООП язык программирования. Можно чудить по черному, написать полную "какашку", но это все равно будет ООП, потому, что сама среда разработки не позволит тебя выйти за допустимые пределы. Я думаю имелось ввиду нарушение принципов ООП.
0
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
21.10.2019, 12:04
В точечном синтаксисе:
C#
1
2
3
4
5
6
var select2 = sections.Where(section => 
    section.opened > 2000
    && section.sectList.All(
        name => students.First(student => student.name == name).age < 21
    )
);
Там у Оскара имя не совпало. Формально это косяк, выбрасывающий исключение.
Так и должно быть. Раз идентификатор, значит идентификатор.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16124 / 11248 / 2888
Регистрация: 21.04.2018
Сообщений: 33,080
Записей в блоге: 2
21.10.2019, 12:14
_katon_, самые общие рекомендованные правила это SOLID.
И обычно под нарушением ООП подразумевается их нарушение.

Так же очень желательно соблюдать правила Naming Guidelines
1
 Аватар для _katon_
414 / 265 / 25
Регистрация: 03.10.2011
Сообщений: 1,094
21.10.2019, 12:34
Элд Хасп, я не предлагаю дальше дискутировать . Просто с моей точки зрения не ООП и нарушает ООП принципиально различны. Не ООП - это все оставшееся, например, функциональное программирование. Нарушает ООП - это все таки ООП, но с ошибками, недостатками и т.д. Хреновое ООП - все равно ООП.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.10.2019, 12:34
Помогаю со студенческими работами здесь

Сверка двух таблиц по нескольким параметрам и формирование итоговых результатов
Добрый вечер Может кто подскажет, где я допустил ошибку, но результат такого вычисления получается заведомо не верным Задание: с двух...

Как правильно сделать сравнение двух объектов по нескольким параметрам?
Доброго времени суток. Столкнулся тут с проблемкой - ничего не могу :( Сравниваю два объекта по его свойствам. Написал вот такой кодик ...

Объединение двух связанных списков (нужен совет)
шаблон ListNode #pragma once // оголошення, щоб зробити другом template&lt; typename NODETYPE &gt; class List; // шаблон класу ...

Фильтр по нескольким параметрам
Добрый день форумчане! Есть задача сделать фильтр как на картинке. Есть группы фильтра, у каждой записи есть пользовательские поля. ...

Поиск по нескольким параметрам?
Вот поиск по фамилии - RS.Find 'fam Like ' &amp; ''' &amp; strFind &amp; ''' adSearchForward А как его сделать и по фамилии и по имени...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru