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

Работа с разными колекциями

14.06.2017, 02:58. Показов 1354. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Строю по задачке модель магазина. В классе "Store" метод "sell_product" нужно сделать по принципу:
1. Берем первого клиента из очереди "queue".
2. Залазим в его список покупок "shopping_list ", берем первый. По имени товара проверяем есть ли товар на складе магазина "products_list".
3. Проверяем хватает ли товара на складе "quantity". Пример: у клиента в списке - "морковка 10 шт." а на складе есть только 5 шт.
4. Проверяем хватит ли у клиента денег "money" на покупку. (price * quantity).
5. Продаем товар, идем дальше по списку покупок.

У меня возникли проблемы с этими коллекциями.
У них нет индексирования. В одном foreach нельзя получить ссылки на объекты сразу 2-х коллекций.
Не получается одновременно доступатся до полей 2-х объектов разных коллекций, чтобы проводить поиск из пункта 2 и проверку полей из пункта 3.
У коллекции SortedSet есть метод Contains(), но он не возвращает объект который нашел. Нужно писать поиск в ручную? или найдется решение по изящнее?

Подскажите как это сделать.

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
class Store
{
    SortedSet<Product> products_list;//товары на складе
    Queue<Client> queue;                    //Очередь
    public void sell_product()
    {
        var buyer = queue.Dequeue();
 
        foreach (var i in buyer.shopping_list)
        {
 
        }
    }
}
class Product
{
    public string name { get; }
    public double purchase_price { get; }
    public uint quantity { get; }
}
class Client
{
    public Stack<Product> shopping_list { get; }  //Список покупок
    public double money { get; }
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.06.2017, 02:58
Ответы с готовыми решениями:

работа с разными АК
Подскажите, пожалуйста, как правильно сделать Есть два сервера, разные домены и АК Необходимо обе...

Работа с разными пакетами
Всем доброго дня. Подскажите ссылку - не смог найти нормального объяснения в гугле. Нужно...

Работа с разными базами данных
Здравствуйте! Где можно почитать про архитектуру системы, в которой можно будет переключаться...

Работа с потоками с разными приоритетами
Дали такое задание: Напишите программу, которая создает один поток и позволяет пользователю...

5
34 / 34 / 16
Регистрация: 04.06.2017
Сообщений: 158
14.06.2017, 10:04 2
Лучший ответ Сообщение было отмечено Pavel Rem как решение

Решение

Ну у меня получилось примерно это

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public void sell_product()
        {
            var buyer = queue.Dequeue();
 
            foreach (var i in buyer.Shopping_list)
            {
                IEnumerable<Products> seling = products_list.Where(n => n.Name == i.Name);
                if (seling.ElementAt(0).Quantity < i.Quantity)
                    Console.WriteLine("Товар " + seling.ElementAt(0).Name + ": Нет достаточного количества на складе");
                else if (seling.ElementAt(0).Purchase_price * i.Quantity > buyer.Money)
                    Console.WriteLine("Недостаточно денег");
                else
                    Console.WriteLine("Товар продан");
            }
  }
Скорее всего с помощью LINQ запросов можно написать еще короче, вообще без форыча, но я слабовато с ними знаком, что бы такие фортеля выкидывать

Добавлено через 7 минут
Ну там соответственно еще по логике нужно добавить уменьшение товара на складе и уменьшение денег у клиента при удачной покупке

Добавлено через 5 минут
да и клиента я бы удалял уже после совершения всех покупок, вдруг он в связи с нехваткой денег или отсутствием товара, решит изменить список покупок

И да я еще не проверял, на то что если о товаре из списка покупателя на складе вообще ничего не знают... тоже обработать нужно..
1
30 / 47 / 19
Регистрация: 23.10.2014
Сообщений: 1,001
14.06.2017, 10:26 3
Pavel Rem, зачем тут SortedSet, Queue и Stack? По моему они тут не нужны. Если конечно они не по заданию... Я бы сделал так:

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
class Store
{
    List<Product> products; //товары на складе
    List<Client> clients; //Очередь
    
    public void SellProduct()
    {
        var buyer = clients.First();
 
        foreach (var storedProduct in buyer.Basket)
        {
            var basketProduct = products.First(x => x.Name == storedProduct.Name);
            
            if (basketProduct.Count < storedProduct.Count)
                Console.WriteLine($"Товар {basketProduct.Name}: Нет достаточного количества на складе");
            else if (basketProduct.Price * basketProduct.Count > buyer.Money)
                Console.WriteLine("Недостаточно денег");
            else
            {
                storedProduct.Count -= basketProduct.Count;
                Console.WriteLine("Товар продан");
            }
        }
    }
}
 
class Product
{
    public string Name { get; }
    public double Price { get; }
    public int Count { get; set; }
}
 
class Client
{
    public List<Product> Basket { get; } //Список покупок
    public double Money { get; }
}
0
34 / 34 / 16
Регистрация: 04.06.2017
Сообщений: 158
14.06.2017, 10:35 4
Зачем? зачем?... Что бы жизнь медом не казалась
0
11 / 11 / 2
Регистрация: 15.07.2016
Сообщений: 132
14.06.2017, 14:25  [ТС] 5
Спасибо! Объясните пожалуйста что происходит в этой строке.
Цитата Сообщение от DanLan Посмотреть сообщение
IEnumerable<Products> seling = products_list.Where(n => n.Name == i.Name);
А насчет:
Цитата Сообщение от DanLan Посмотреть сообщение
да и клиента я бы удалял уже после совершения всех покупок
Клиент удаляется из очереди в этой строке
Цитата Сообщение от DanLan Посмотреть сообщение
var buyer = queue.Dequeue();
0
34 / 34 / 16
Регистрация: 04.06.2017
Сообщений: 158
14.06.2017, 23:49 6
Цитата Сообщение от Pavel Rem Посмотреть сообщение
Спасибо! Объясните пожалуйста что происходит в этой строке.
Цитата Сообщение от DanLan Посмотреть сообщение
IEnumerable<Products> seling = products_list.Where(n => n.Name == i.Name);
Получаем коллекцию элементов(конкретно в данном случае из одного элемента) типа Product из элементов (Продуктов) списка product_list в котором название( Product.Name из product_list(n.Name)) продукта совпадает с названием текущего(Product.Name из shopping_list (i.Name)) продукта из листа клиента.

Добавлено через 24 минуты
Цитата Сообщение от Pavel Rem Посмотреть сообщение
А насчет:
Цитата Сообщение от Danlan Посмотреть сообщение
да и клиента я бы удалял уже после совершения всех покупок
Клиент удаляется из очереди в этой строке
Цитата Сообщение от Danlan Посмотреть сообщение
var buyer = queue.Dequeue();
Вот именно что здесь У Вас клиент удаляется на кассе. Тобишь перед тем как начинается сверка листов(перед циклом). А по хорошему он должен удаляться после оплаты покупки или отказа от покупки

тобишь после выхода из цикла.


P.S. Кстати, реализация Dark Byte метода будет более правильная, нежели моя. Правда походу он вообще забыл клиента из очереди удалить. Так что на его кассе очередь будет вечной, и покупатель все купив так и останется стоять у кассы

Цитата Сообщение от Dark Byte Посмотреть сообщение
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    List<Product> products; //товары на складе
    List<Client> clients; //Очередь
    
    public void SellProduct()
    {
        var buyer = clients.First();
 
        foreach (var storedProduct in buyer.Basket)
        {
            var basketProduct = products.First(x => x.Name == storedProduct.Name);
            
            if (basketProduct.Count < storedProduct.Count)
                Console.WriteLine($"Товар {basketProduct.Name}: Нет достаточного количества на складе");
            else if (basketProduct.Price * basketProduct.Count > buyer.Money)
                Console.WriteLine("Недостаточно денег");
            else
            {
                storedProduct.Count -= basketProduct.Count;
                Console.WriteLine("Товар продан");
            }
        }
    }
1
14.06.2017, 23:49
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.06.2017, 23:49
Помогаю со студенческими работами здесь

Работа с разными типами данных
Вот написал код, который выводит таблицу Пифагора :using System; namespace Cons { class...

Работа с разными версиями Outlook
Доброго всем дня! Есть приложение, отсылающее (или подготавливающее для отправки) e-mail'ы....

Работа с разными конфигурациями наполнения формы
Задумка такая - в зависимости от значения ComboBox я планирую менять элементы на форме, тоесть...

Работа с TStringList между разными формами
Коллеги, добрый день, Есть основная форма, из нее запускается вторая форма, в которой происходит...

Работа с разными объектами в одной процедуре
Добрый день, подскажите как правильно написать код. Задача допустим есть 2 кнопки. нужно по...

Работа с Access с разными версиями .NET
Среда Visual Studio 2015. Когда по умолчание стоит версия 4.6 такой код работает, а когда меняю на...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Использование связки C# и PHP в корпоративной разработке и микросервисной архитектуре
InfoMaster 16.01.2025
Введение в интеграцию C# и PHP В современной корпоративной разработке все чаще возникает потребность в создании гибких и масштабируемых решений, способных эффективно решать широкий спектр. . .
Как использовать Kerio дома для управления сетью и пользователями
InfoMaster 16.01.2025
Использование технологий для улучшения повседневной жизни стало неотъемлемой частью современного быта. Одной из таких технологий является Kerio — мощный инструмент для управления сетью и. . .
Есть ли будущее у DVD и Blu-ray?
InfoMaster 16.01.2025
В эпоху стремительного развития цифровых технологий и повсеместного распространения потоковых сервисов вопрос о будущем физических носителей информации становится все более актуальным. Особенно остро. . .
Как проводить научные вычисления на Python
InfoMaster 15.01.2025
Python стал одним из наиболее востребованных языков программирования в области научных вычислений благодаря своей простоте, гибкости и обширной экосистеме специализированных библиотек. Научные. . .
Создание игры типа Minecraft на PyGame/Python: пошаговое руководство
InfoMaster 15.01.2025
В данном руководстве мы рассмотрим процесс создания игры в стиле Minecraft с использованием библиотеки PyGame на языке программирования Python. Этот проект идеально подходит как для начинающих. . .
Как создать свою первую игру в стиле Doom на Unreal Engine
InfoMaster 15.01.2025
Разработка шутера от первого лица в стиле классического Doom представляет собой увлекательное путешествие в мир игрового программирования, где сочетаются творческий подход и технические навыки. . . .
Параллельное программировани­е: основные технологии и принципы
InfoMaster 15.01.2025
Введение в параллельное программирование Параллельное программирование представляет собой фундаментальный подход к разработке программного обеспечения, который позволяет одновременно выполнять. . .
Как написать микросервис на C# с Kafka, MediatR, Redis и GitLab CI/CD
InfoMaster 15.01.2025
В современной разработке программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот подход позволяет разделить сложную систему. . .
Что такое CQRS и как это реализовать на C# с MediatR
InfoMaster 15.01.2025
Концепция CQRS и её роль в современной разработке В современном мире разработки программного обеспечения архитектурные паттерны играют ключевую роль в создании масштабируемых и поддерживаемых. . .
Как настроить CI/CD с Azure DevOps
InfoMaster 15.01.2025
CI/ CD, или непрерывная интеграция и непрерывное развертывание, представляет собой современный подход к разработке программного обеспечения, который позволяет автоматизировать и оптимизировать процесс. . .
Как настроить CI/CD с помощью Jenkins
InfoMaster 15.01.2025
Введение в CI/ CD и Jenkins В современной разработке программного обеспечения непрерывная интеграция (CI) и непрерывная доставка (CD) стали неотъемлемыми элементами процесса создания качественных. . .
Как написать микросервис на Go/Golang с Kafka, REST и GitHub CI/CD
InfoMaster 14.01.2025
Определение микросервиса, преимущества использования Go/ Golang Микросервис – это архитектурный подход к разработке программного обеспечения, при котором приложение состоит из небольших, независимо. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru