Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
14 / 11 / 1
Регистрация: 16.08.2016
Сообщений: 75
1
.NET 4.x

Функция для класса, получающая доступ к нему, не клонируя

19.08.2022, 16:21. Показов 558. Ответов 3

Author24 — интернет-сервис помощи студентам
Доброго дня, коллеги

Есть модель датчика освещения:
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
/// <summary>
/// Модель освещения.
/// </summary>
public class LightSensorModel
{
    /// <summary>
    /// SVG иконки локаций.
    /// </summary>
    private Dictionary<string, byte[]> Icons = new Dictionary<string, byte[]>()
    {
        { "Гостиная", Resources.LightSensorResources.LivingRoom },
        { "Арка гостиной", Resources.LightSensorResources.LivingGate },
        { "Кухня", Resources.LightSensorResources.KitchenTableware },
        { "Кухонный шкафчик", Resources.LightSensorResources.KitchenWardrobe }
    };
        
    /// <summary>
    /// Этаж освещения.
    /// </summary>
    public string Level;
 
    /// <summary>
    /// Локация освещения.
    /// </summary>
    public string Location;
 
    /// <summary>
    /// Описание освещения.
    /// </summary>
    public string Caption;
 
    /// <summary>
    /// Статус работы.
    /// </summary>
    public bool Powered;
 
    /// <summary>
    /// Статус подключения датчика освещения.
    /// </summary>
    public bool IsConnected;
}
Необходимо получить иконку для этого датчика, используя его описание.
Пример:
C#
1
2
LightSensorModel Light = new LightSensorModel() { Caption = "Гостиная" };
var svg = Light.GetIcon(); // Иконка "LivingRoom"
Я понимаю, что можно опредедлить функцию такой сигнатуры:
C#
1
public static GetIcon(string caption) => LightSensorModel.Icons.FirsOrDefault(x => x.Key == caption).Value;
Но в таком случае мне нужно будет делать Dictionary статичным и вызывать так:
C#
1
2
LightSensorModel Light = new LightSensorModel() { Caption = "Гостиная" };
var svg = Light.GetIcon("Гостиная");
Но я стремлюсь к такому вызову как в примере.

Вопрос:
Как определить функцию, которая:
  • Не требует статичных полей
  • Не требует передаваемых параметров
  • Не создает новый экземпляр модели
  • Использует экземпляр модели, из которой была вызвана

Пытаюсь описать идею функции которую, по-моему, реализует .ToString().
Пожалуйста, подскажите название или тип таких функций, статью – все что угодно, что может помочь с решением.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.08.2022, 16:21
Ответы с готовыми решениями:

Функция получающая и возвращающая ссылку на объект класса istream
В учебнике дано задание с флагами с использованием istream и ostream. Предполагается, видимо, что я...

Функция, получающая указатель на обычную функцию, получает указатель на метод класса
Здравтсвуйте. Имеется вопрос по указателям на методы класса. Допустим, есть функция( f ), которая...

Создание класса, его объявление и доступ к нему
Здравствуйте! Простите, если пишу не в тот раздел. Решил на досуге попрограмировать и вот дошел...

Функция, получающая формат даты и времени в виде параметра
Нужна функция получающая формат даты и времени в виде параметра и возвращающая дату и время в виде...

Функция, получающая подстроку, возвращает испорченный указатель на строку
Пытаюсь выделить подстроку в Microsoft Visual C++ 2013, чтобы убрать путь к файлу и оставить только...

3
Администратор
Эксперт .NET
17548 / 13771 / 5298
Регистрация: 17.03.2014
Сообщений: 28,247
Записей в блоге: 1
19.08.2022, 16:34 2
Лучший ответ Сообщение было отмечено Dr_FvKE как решение

Решение

Dr_FvKE, что мешает сделать так?
C#
1
public byte[] GetIcon() => Icons[Caption];
Цитата Сообщение от Dr_FvKE Посмотреть сообщение
C#
1
LightSensorModel.Icons.FirstOrDefault(x => x.Key == caption)
Никогда так не делайте. Это сильно замедляет поиск. Вместо временной сложности O(1) вы получаете O(N). Для поиска по ключу нужно использовать индексатор или TryGetValue.
0
14 / 11 / 1
Регистрация: 16.08.2016
Сообщений: 75
19.08.2022, 16:41  [ТС] 3
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Dr_FvKE, что мешает сделать так?
C#
1
public byte[] GetIcon() => Icons[Caption];

Никогда так не делайте. Это сильно замедляет поиск. Вместо временной сложности O(1) вы получаете O(N). Для поиска по ключу нужно использовать индексатор или TryGetValue.
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Никогда так не делайте. Это сильно замедляет поиск.
Спасибо, возьму на заметку! Использовал этот метод за имением небольших списков и весьма редких к ним обращений.

Цитата Сообщение от OwenGlendower Посмотреть сообщение
что мешает сделать так?
Думал об этом, пробовал, работает. Мне показалось, что это не совсем правильная реализация для этой задачи, хоть и результат имеет требуемый. Если такой подход здесь уместен и на самом деле нет никаких "закулисных" танцев с абстрактными классами, то оставлю такое решение и можно закрывать тему.
0
Администратор
Эксперт .NET
17548 / 13771 / 5298
Регистрация: 17.03.2014
Сообщений: 28,247
Записей в блоге: 1
19.08.2022, 17:05 4
Цитата Сообщение от Dr_FvKE Посмотреть сообщение
Использовал этот метод за имением небольших списков и весьма редких к ним обращений.
Понятно что для коллекции из 4 элементов разница между правильным и неправильным подходом будет практически незаметной. Но это не значит что нужно так делать. Код просто странно выглядит.
0
19.08.2022, 17:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.08.2022, 17:05
Помогаю со студенческими работами здесь

Функция получающая как параметер Матрицу целых чисел NxN и количество ее строк
Доброго времени суток друзья, вопрос такой. мне надо написать функцию получающую матрицу NxN и...

Модем ADSL подключен к интернету, к нему подключен маршрутизатор TL-WR841N, возможен ли к нему внешний доступ ?
Всем привет Модем подключен к интернет через ADSL (pppoe) , к модему подключен...

Дружественная функция-оператор, доступ к закрытым полям класса
У меня есть класс MyClass, вот код: class MyClass { int x, y; public: MyClass(); friend...

Разрешить доступ к методу класса только для другого класса
Здравствуйте, нужно что бы у Item ссылка на Box была только для чтения, но при добавлении Item в...

Дружественная функция не может получить доступ к приватным данным класса
Доброго времени суток уважаемые форумчане), пытаюсь реализовать дружественную функцию которая берет...

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


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

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