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

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

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

Студворк — интернет-сервис помощи студентам
Строю по задачке модель магазина. В классе "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
Ответы с готовыми решениями:

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

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

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

5
34 / 34 / 16
Регистрация: 04.06.2017
Сообщений: 158
14.06.2017, 10:04
Лучший ответ Сообщение было отмечено 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
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
Зачем? зачем?... Что бы жизнь медом не казалась
0
 Аватар для Pavel Rem
11 / 11 / 2
Регистрация: 15.07.2016
Сообщений: 132
14.06.2017, 14:25  [ТС]
Спасибо! Объясните пожалуйста что происходит в этой строке.
Цитата Сообщение от 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
Цитата Сообщение от 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.06.2017, 23:49
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru