Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.74/19: Рейтинг темы: голосов - 19, средняя оценка - 4.74
0 / 0 / 0
Регистрация: 13.11.2020
Сообщений: 5
1
.NET Core

LINQ по коллекции с элементами в которых есть вложенная коллекция

25.12.2020, 19:23. Показов 3557. Ответов 4
Метки linq (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый вечер.

Дан класс Car со свойствами:
int ID - уникальный идентификатор машины (обычно автогенерируемый идентификатор)
string Name - наименование машины
int ReleaseDate - дата выпуска
int Price - цена
string SpecialDescription - особые пометки
bool IsInStock - проверяет, находится ли на складе

Дан класс Stock со свойствами:
int ID - уникальный идентификатор склада (обычно автогенерируемый идентификатор)
string Description - описание склада
string CityName - наименование города, в котором находится склад
List<Car> CarsCollection - коллекция машин, которая на данный момент хранится на складе

Создаем список складов:
Склад_Бишкек
Склад_Ош
Склад_Каракол
Склад_Талас

и размещаем на каждом складе от 10 до 50 разных машин следующих марок:
Cadillac
BMW
Hyundai
Reno
Volvo
Lada
Porsche
Infinity
Suzuki
Toyota
Mercedes
Ford
Alfa_Romeo
Nissan

Для создания машин написать генератор, который генерировал бы список машин со следующими параметрами и добавлял бы случайным образом на разные склады:
ID - при каждом создании машины присваивать новый автоинкрементный идентификатор
Name - случайным образом присвоить машины из предоставленного выше списка
ReleaseDate - дата выпуска между годами 1998 и 2020
Price - цена от 1000$ до 500000$ с условием, что чем старше машина, тем меньше её стоимость
SpecialDescription - только для машин с 2016 года выпуска отмечать в данном поле, что машина должна проходить техосмотр
IsInStock - пометить случайным образом, что машина есть в наличии на складе или её нет


С помощью LINQ-запросов сформировать следующие отчёты:

Найти на всех складах машину марки Alfa_Romeo, которые имеются в наличии на складе, т.е. IsInStock == true.
Вывести все склады, где есть машина BMW.
Найти все машины, которые стоят меньше 10000$.
Найти все машины с отметкой о техосмотре и отсортировать по имени.
Вывести все склады, на которых есть машины с годом выпуска с 2000 до 2005 и отсортировать их по количеству машин на складе (сначала, где их много).
Вывести все машины, выпущенные до 2000 года и отсортировать их по году выпуска.


Не знаю как выполнить эти два задания. Тоесть надо произвести при помощи LINQ поиск в коллекции коллекций. как это сделать?
1.Вывести все склады, где есть машина BMW.
2.Вывести все склады, на которых есть машины с годом выпуска с 2000 до 2005 и отсортировать их по количеству машин на складе (сначала, где их много).
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.12.2020, 19:23
Ответы с готовыми решениями:

Коллекция в коллекции. Как оперировать элементами?
Всем привет. Не смог нагуглить сам (не знаю даже какой запрос делать), поэтому обращаюсь на форум....

Вложенная коллекция - ошибка выхода за ее пределы
public class Test { private List&lt;List&lt;T&gt;&gt; doubleList; // вложенный список ...

С помощью LINQ проверить, есть ли в коллекции одинаковые элементы
Есть массив int mass3 = new int { 9, 9, 8, 5, 13, 3, 2, 6, 4, 0 };, не знаю, как с помощью LINQ...

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

4
Модератор
Эксперт .NET
15465 / 10711 / 2786
Регистрация: 21.04.2018
Сообщений: 31,531
Записей в блоге: 2
25.12.2020, 19:43 2
Цитата Сообщение от StivenDiplet Посмотреть сообщение
оесть надо произвести при помощи LINQ поиск в коллекции коллекций. как это сделать?
Дайте образец данных на котором можно показать пример.
0
0 / 0 / 0
Регистрация: 13.11.2020
Сообщений: 5
25.12.2020, 19:54  [ТС] 3
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
        static void Main(string[] args)
        {
            var brands = new List<string>
            {
                "Cadillac",
                "BMW",
                "Hyundai",
                "Reno",
                "Volvo",
                "Lada",
                "Porsche",
                "Infinity",
                "Suzuki",
                "Toyota",
                "Mercedes",
                "Ford",
                "Alfa_Romeo",
                "Nissan",
            };
 
            var stocks = new List<Stock>
            {
                new Stock(1192344, "ARPS", "Bishkek"),
                new Stock(1264534, "ESSL", "Osh"),
                new Stock(9037344, "ESLP", "Karakol"),
                new Stock(1239475, "BLST", "Talas"),
            };
 
            for (int i = 0; i < 50; i++)
            {
                stocks[0].AddCarInCollection(CarGenerator(brands));
                stocks[1].AddCarInCollection(CarGenerator(brands));
                stocks[2].AddCarInCollection(CarGenerator(brands));
                stocks[3].AddCarInCollection(CarGenerator(brands));
            }
 
            var specificBrandCars = GetSpecificBrand(stocks, brands);
            var allStocksWithBMW = GetAllStocksWithBMW(stocks, brands);
            var carsLessPrice = GetCarsLessPrice(stocks, 10000);
            var inspectionsCars = GetInspectionsCars(stocks, "Требуется Техосмотр!");
            var sortStockOfCarsRelease = GetSortStockOfCarsRelease(stocks);
            var sortCarsRelease = GetSortCarsRelease(stocks, 2000);
 
            foreach (var i in allStocksWithBMW)
            {
                Console.WriteLine(i.CityName);
            }
 
            foreach(var i in allStocksWithBMW[3].CarsCollection)
            {
                i.GetInfoOfCar();
            }
        }
 
        static List<Car> GetSpecificBrand(List<Stock> stocks, List<string> brands)
        {
            List<Car> specificBrandCars = new List<Car>();
 
            for (int i = 0; i < 4; i++)
            {
                specificBrandCars.AddRange(stocks[i].CarsCollection
                                                    .Where(x => x.Name == brands[12])
                                                    .Where(x => x.IsInStock == true)
                                                    .ToList());
            }
 
            return specificBrandCars;
        }
 
        static List<Car> GetInspectionsCars(List<Stock> stocks, string description)
        {
            List<Car> specificBrandCars = new List<Car>();
 
            for (int i = 0; i < 4; i++)
            {
                specificBrandCars.AddRange(stocks[i].CarsCollection
                                                    .Where(x => x.SpecialDescription == description)
                                                    .OrderBy(x=> x.Name)
                                                    .ToList());
            }
 
            return specificBrandCars;
        }
 
        static List<Car> GetCarsLessPrice(List<Stock> stocks, int price)
        {
            List<Car> specificBrandCars = new List<Car>();
 
            for (int i = 0; i < 4; i++)
            {
                specificBrandCars.AddRange(stocks[i].CarsCollection
                                                    .Where(x => x.Price < price)
                                                    .ToList());
            }
 
            return specificBrandCars;
        }
 
        static List<Car> GetSortCarsRelease(List<Stock> stocks, int release)
        {
            List<Car> sortCarsRelease = new List<Car>();
 
            for (int i = 0; i < 4; i++)
            {
                sortCarsRelease.AddRange(stocks[i].CarsCollection
                                                    .Where(x => x.ReleaseDate < release)
                                                    .ToList());
            }
 
            return sortCarsRelease.OrderByDescending(x=>x.ReleaseDate).ToList();
        }
 
        static List<Stock> GetAllStocksWithBMW(List<Stock> stocks, List<string> brands)
        {
            stocks.Where(x => x.CarsCollection.Where(y => y.Name == brands[1]) == x.CarsCollection.Where(y => y.Name == brands[1]))
                  .ToList();
            return stocks;
        }
 
        static List<Stock> GetSortStockOfCarsRelease(List<Stock> stocks)
        {
            stocks.Where(x => x.CarsCollection == x.CarsCollection.Where(y => y.ReleaseDate == 2000 || y.ReleaseDate == 2001 || y.ReleaseDate == 2002 || y.ReleaseDate == 2003 || y.ReleaseDate == 2004 || y.ReleaseDate == 2005))
                  .ToList();
            return stocks;
        }
 
        static Car CarGenerator(List<string> brands)
        {
            Random random = new Random();
 
            int id = random.Next(1000, 9999);
 
            int x = random.Next(0, 14);
            string name = brands[x];
 
            int realiseDate = random.Next(1998,2020);
 
            int price = random.Next(1000, 500000);
 
            string specialDiscription = "Требуется Техосмотр!";
            if (realiseDate > 2016)
            {
                specialDiscription = "Техосмотр не требуется!";
            }
           
            int inStock = random.Next(1, 3);
            bool IsInStock = true;
            if (inStock == 1)
            {
                IsInStock = false;
            }
 
            var car = new Car(id, name, realiseDate, price, specialDiscription, IsInStock);
            return car;
        }
Добавлено через 2 минуты
я ток недавно на это форуме так шо туплю по интерфейсу. сверху я скинул свой код.
Вот два метода в которых надо выполнить эти два задания
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
         static List<Stock> GetAllStocksWithBMW(List<Stock> stocks, List<string> brands)
        {
            stocks.Where(x => x.CarsCollection.Where(y => y.Name == brands[1]) == x.CarsCollection.Where(y => y.Name == brands[1]))
                  .ToList();
            return stocks;
        }
 
        static List<Stock> GetSortStockOfCarsRelease(List<Stock> stocks)
        {
            stocks.Where(x => x.CarsCollection == x.CarsCollection.Where(y => y.ReleaseDate == 2000 || y.ReleaseDate == 2001 || y.ReleaseDate == 2002 || y.ReleaseDate == 2003 || y.ReleaseDate == 2004 || y.ReleaseDate == 2005))
                  .ToList();
            return stocks;
        }
0
Модератор
Эксперт .NET
15465 / 10711 / 2786
Регистрация: 21.04.2018
Сообщений: 31,531
Записей в блоге: 2
25.12.2020, 20:12 4
Лучший ответ Сообщение было отмечено StivenDiplet как решение

Решение

StivenDiplet, ну, для точного ответа нужна ещё реализация типов Stock и Car.

Stock - как я понял это типа Склада.
И в нём есть коллекция CarsCollection из Car.
Car.Name содержит название модели по которому и надо определить BMW.
C#
1
2
3
4
        static List<Stock> GetAllStocksWithModel(List<Stock> stocks, string model)
        {
            return stocks.Where(stock => stock.CarsCollection.Any(car => car.Name == model)).ToList();
        }
Добавлено через 6 минут
Цитата Сообщение от StivenDiplet Посмотреть сообщение
2.Вывести все склады, на которых есть машины с годом выпуска с 2000 до 2005 и отсортировать их по количеству машин на складе (сначала, где их много).
Дата выпуска, наверное в свойстве RealiseDate ?
C#
1
2
3
4
5
6
        static List<Stock> GetSortStockOfCarsPeriodRelease(List<Stock> stocks, int begin, int end)
        {
            return stocks.Where(stock => stock.CarsCollection.Any(car => car.ReleaseDate >= begin && car.ReleaseDate <= end))
                  .OrderBy(stock => - stock.CarsCollection.Count)
                  .ToList();
        }
1
0 / 0 / 0
Регистрация: 13.11.2020
Сообщений: 5
25.12.2020, 20:44  [ТС] 5
Спасибо большое! вчера 2.5 часа пытался сам реализовать с доп алгоритмами помимо линка! Оказалось можно проще) Еще раз благодарю.
0
25.12.2020, 20:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.12.2020, 20:44
Помогаю со студенческими работами здесь

C# linq to entities. Получить хранящиеся в памяти элементы коллекции в linq запросе
Доброго времени суток! Код для ознакомления: где db - контекст БД this.parameters =...

LINQ to XML выбрать все элементы у которых есть определенный аттрибут
Здарвствуйте подскажите как с помошью LINQ to XML выбрать все элементы у которых есть аттрибут с...

Коллекция в коллекции
Здравствуйте! У меня вопрос по коллекциям в коллекциям, есть следующий map Map&lt;String,...

Коллекция в Коллекции (ObservableCollection<T>)
Как добавлять элементы в коллекцию, что находится в коллекции (пред-стартаво) ...

Linq to xml - не работает, коллекция все время пустая
Не могу понять, что не правильно: XElement xdoc = XElement.Load(&quot;http://www.onliner.by/feed&quot;); ...

Вставить число К перед всеми элементами, в которых есть цифра 1
Вставить число К перед всеми элементами, в которых есть цифра 1. И ее надо написать не в консоли...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru