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

Проверка значений элементов класса относительно словаря из другого класса

25.12.2016, 22:30. Показов 1489. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!
Есть класс некого предмета, который содержит булиновский словарь:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class SomeObject
    {
        // кольори
        public bool red = false,
            orange = false,
            yellow = false,
            green = false,
            blue = false,
            violet = false,
            black = false,
            brown = false,
            white = false,
            // смак
            bitter = false,
            sweet = false,
            salt = false,
            sour = false,
...
И есть второй клас действий, вложенный в класс объекта, который имеет также свой словарь, с ключовыми словами идентичными первому словарю но уже типа дабл.
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
 public abstract class PersonActions
    {
        public Dictionary<string, double> Exp = new Dictionary<string, double>()
        {
            // кольори
            ["red"] = 1,
            ["orange"] = 0.8,
            ["pink"] = 0.8,
            ["yellow"] = 0.8,
            ["green"] = 0.8,
            ["blue"] = 0.8,
            ["violet"] = 0.8,
            ["black"] = 0.8,
            ["brown"] = 0.8,
            ...
        public abstract int Execute(SomeObject a);
    }    
...
public class Persone : SomeObject
    {
        public class Eats : PersonActions
        {
            public override int Execute(SomeObject obj)
            {
                GlobalVars.ObjectsOnMap.Remove(obj);
                return obj.health;
            }
        }
        
        }
 
        private Eats Eat = new Eats();
...
Класс объекта имеет метод, который должен вычислить среднее значение элементов словаря класса действий, относительно значений словаря класса предмета и записать это значение в соответствующую переменную в классе действий.
C#
1
2
3
4
5
6
7
8
 public void Calculate_Motivation(PersonActions p_actn, SomeObject a) 
        {
            foreach (var field in a.GetType().GetFields(BindingFlags.Instance | BindingFlags.NonPublic))
                if (p_actn.Exp.ContainsKey(field.Name) && (bool)(field.GetValue(a)) && GlobalVars.IsBool(a))
                {
                    p_actn.motivation += p_actn.Exp[field.Name];
                }
        }
Вот здесь у меня и проблемма. Условие (p_actn.Exp.ContainsKey(field.Name) && (bool)(field.GetValue(a)) && GlobalVars.IsBool(a)) не проходит проверку. Помогите написать метод, пожалуйста.
З.Ы.
Знаю что после условия не вычисляется среднее значение, мне просто надо, пока, чтобы условие выполниолсь.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.12.2016, 22:30
Ответы с готовыми решениями:

Видимость класса относительно другого класса
class A;//Это просто поставили класс А в видимость класса В? class B { A a; }; class A{}; Я просто, трактовал это...

Как связать сигнал одного класса со слотом другого класса, содержащего указатель на объект этого класса?
Подскажите, пожалуйста, как связать сигнал одного класса со слотом другого класса, содержащего указатель на объект этого класса. Буду очень...

Изменение класса элемента в зависимости его положения относительно другого
Добрый день, стояла задача написать скрипт: когда элемент A достигнет позиции элемента B, добавится определенный класс элементу B. Сам...

5
24 / 10 / 5
Регистрация: 30.01.2015
Сообщений: 175
25.12.2016, 23:36
А можете описать изначально какая была задача? А то как глянул объект SomeObject в котором n-колво полей, да ещё и каждому вы вручную присвоили начальное значение false, аж плохо стало.
0
3 / 3 / 1
Регистрация: 06.04.2009
Сообщений: 165
26.12.2016, 20:54  [ТС]
Я изучаю С# и сам себе ставлю задачи. Если у вас есть идея как оптимизировать тот код, что я предоставил, то вот моя текущая задача:
Кликните здесь для просмотра всего текста

Научить объект самостоятельно, методом проб и ошибок, научится правильно использовать предметы. Тоесть есть куча различных предметов с самыми различными свойствами. Одни свойства скрыты и появятся только после использования, вторые явные, такие как цвет, форма, вкус и т. д. Каждое действие имеет свою "память" на каждое явное свойство. Когда надо применит какое-то действие к предмету, подсчитывается среднее значение памяти каждого действия и выбирается то у которого найбольшее. В будущем я создам форму с чекбоксами, чтобы облегчить создание свойств предметов.


Добавлено через 20 часов 34 минуты
Вопрос еще актуален.
0
24 / 10 / 5
Регистрация: 30.01.2015
Сообщений: 175
26.12.2016, 23:27
Ukrajinec, На самом деле, я вам вчера набирал ответ, потом когда нажал отправить, в этот момент интернет вырубили, и он не отправился, и я плюнул и пошёл спать.
Насчёт оптимизаций, мне пока не совсем понятно зачем такая композиция классов. Использовать наследование нужно с умом! Насчёт класса "предмета", лучше назовите Subject, суффикс Object сбивает с толку.
Свойства нашего предмета выделим в отдельный енум. И будем использовать его, что бы неошибится случайно при вводе строки!
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
    public enum SubjectProperties
    {
        Red, Orange, Yellow, Green, Blue, // colors
        Bitter, Sweet, Salt, Sour // taste
    }

Класс предмета:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
    public class Subject
    {
        // это и будет наш словарь булевых значений. 
        // Если свойство находиться в коллекции значит оно существует т.е true
        // если отсутствует значит false
        public HashSet<SubjectProperties> Properties { get; set; }
 
        public Subject()
        {
            this.Properties = new HashSet<SubjectProperties>();
        }
    }
}

Person:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    public class Person
    {
        //если Subject должен быть глобальным объектом, смотрите паттерн синглтон
        Subject subject = new Subject();
 
        // безпонятия что у вас означало Exp
        Dictionary<SubjectProperties, double> PersonExp = new Dictionary<SubjectProperties, double>()
        {
            [SubjectProperties.Red] = 1,
            [SubjectProperties.Orange] = 0.8
        };
 
        public Person()
        {
 
        }
    }

Насчёт создания вложенных классов, вот вы подумайте сами, если у личности(Person) будет 12 действий, вы будете создавать 12 вложенных классов которые перегружают один лишь абстрактный метод? Лучше их уж складывать сразу в класс. К тому же я не вижу вызова метода Execute в Calculate_Motivation.
Ставить самому себе задачу, это конечно хорошо, но из короткого описания я мало, что могу посоветовать. Попробуйте создать ТЗ(техническое задание) где по пунктам будет обозначено, что чтобуется выполнить
1
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
26.12.2016, 23:29
Цитата Сообщение от Ukrajinec Посмотреть сообщение
Я изучаю С# и сам себе ставлю задач
Вам необходимо научиться отлаживать свои программы. Вот одна из статей на эту тему: https://professorweb.ru/my/csh... l2/2_8.php

Добавлено через 55 секунд
http://csharp-and-i.ru/2011/04... al-studio/
1
3 / 3 / 1
Регистрация: 06.04.2009
Сообщений: 165
27.12.2016, 12:44  [ТС]
TopLayer, обязательно прочитаю, спасибо.
kol, Я решил написать что-то вроде псевдоИИ. За эталон взял, конечно, человека. Задача: человек помещен в комнату с неизвестными предметами. Он должен выжить и научиться правильно их использовать.
Почему я решил использовать вложенный класс? Я решил что не человек должен иметь опыт (Exp - Experience)использования предметов, так как тогда он откажется от использования предмета, несколько раз неправильно его применив. Поэтому я дал возможность накапливать опыт действиям. Почему перегружаю столько раз один метод? Так если копипастить класс действий с их словарями, то представляете как раздуется код? А перегрузкой метода эта проблема отпадает и читабельность улучшается.

Добавлено через 12 часов 49 минут
kol, Забыл написать, спасибо. Решение с перечислением хорошая идея.))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.12.2016, 12:44
Помогаю со студенческими работами здесь

Ошибка при попытке использовать объект класса в определении другого класса
Муторное название получилось :scratch: Прошу помощи.... есть созданный класс работы со строкой: &quot;MyString.h&quot; class...

Получить константу из экземпляра класса, который является членом другого класса
class test { const STATUS = 1; } $a = new test(); echo $a::STATUS . PHP_EOL; // работает class bar {

Перегрузка операции + с преобразованием объектов одного класса в объекты другого класса
Доброго времени суток! Изучаю ООП, при выполнении следующего задания возникли сложности: Создать класс Polar для хранения полярных...

Из одного класса обратиться к свойству progressBar из другого класса (основного окна)
Привет! :) Помогите пожалуйста нубу (мне). У меня есть два класса. Первый (основной), его код: namespace CMS { ///...

Конструктор внутри класса, поля которого являются членами другого класса
Вот фрагмент кода. class Class_Figure { Class_Triangle tr1; Class_Circle cr1; public: Class_Figure() { } void...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru