powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Посоветуйте по архитектуре классов
16 сообщений из 16, страница 1 из 1
Посоветуйте по архитектуре классов
    #39527912
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет, помогите плиз с советом.
Хочу хранить список разнородных объектов в HasSet и использовать linq для различных операций.
Однако у этих разнородных объектов есть одинаковые свойства. Думаю проще объяснить на примере.
Есть список(HasSet ) заданий(job) у которых есть следующие свойства

Код: c#
1.
2.
3.
4.
5.
6.
7.
    public class job
        {
            public DateTime strt_time { get; set; }
            public DateTime fnl_date { get; set; }

   // еще  10-15 свойств, не важно каких 
        }


Заполняем весь HasSet объектами класса job и получаем HasSet<job>. Можно применять linq без проблем ко всем свойствам объектов списка.
Теперь нужно добавить в этот HasSet другой объект только с 2 свойствами
Код: c#
1.
2.
3.
4.
5.
    public class pereriv
        {
            public DateTime strt_time { get; set; }
            public DateTime fnl_date { get; set; }
        }



и также использовать те же linq to object, как и раньше, только игнорируя объекты типа pereriv в Hasset.
Что можно сделать, только будет выглядеть по костыльному.
1) Дополнить класс pereriv недостающими свойствами из job и задефолтить их+ добавить признак bool например Isjob и сделать класс pereriv полностью как job.
2) Переписать все linq запросы в 2 уровня- сначала отфильтровываем из HashSet только job, а к нему применяем уже "старый" linq запрос.
Что пробовал делать:
1)Создать для классов job и pereriv общий abstract класс предок AbsClass с 2-мя свойствами strt_time и fnl_date+ MyHashset<T>:HashSet
where T: AbsClass
2) Реализовать в 2-х классах общий интерфейс с теми же 2-мя свойствами и использовать в linq -запросах вместо классов их интерфейсную реализацию.
Однако во всех случаях приходил к тому, что необходимо в классе pereriv доопределять все недостающие свойства до класса job, хотя в нем они не нужны.
Есть ли какое-либо рациональное решение для данной ситуации?
...
Рейтинг: 0 / 0
Посоветуйте по архитектуре классов
    #39527948
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_subОднако во всех случаях приходил к тому, что необходимо в классе pereriv доопределять все недостающие свойства до класса job, хотя в нем они не нужны.

Так и не понял чем базовый класс или интерфейс не устроили.
...
Рейтинг: 0 / 0
Посоветуйте по архитектуре классов
    #39527961
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_subЧто можно сделать, только будет выглядеть по костыльному.
...
2) Переписать все linq запросы в 2 уровня- сначала отфильтровываем из HashSet только job, а к нему применяем уже "старый" linq запрос.
А в чем костыль?
...
Рейтинг: 0 / 0
Посоветуйте по архитектуре классов
    #39527982
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я бы на вашем месте задумался о том, что я делаю не так, если у меня возникают подобные сложности.
класс может наследовать множество интерфейсов. то есть можно в интерфейсе определить 1 поле, в другом другое и дёргать их через эти интерфейсы.
...
Рейтинг: 0 / 0
Посоветуйте по архитектуре классов
    #39528068
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_sub,
- если отделять в коллекциях по признаку, то врооде linq...where есть.
- если использовать список для чего то полезного, тогда интерфейс не нужен для полиморфизма. Наследование нужно. ООП.
...
Рейтинг: 0 / 0
Посоветуйте по архитектуре классов
    #39528179
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,
не так я делаю то, что хочу уместить в одном списке хоть и унаследованные от одного предка класса, но все таки разные.
В общем переделал следующим образом
Структура классов:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
public abstract class BaseClass
    {
        public DateTime strt_time { get; set; }
        public DateTime fnl_date { get; set; }

    }

    public class inheritedjob: BaseClass
    {
        public string MyProperty1 { get; set; }
        public string MyProperty2 { get; set; }
        public string MyProperty3 { get; set; }
        public string MyProperty4 { get; set; }
        public string MyProperty5 { get; set; } 
        public bool InWork { get; set; }

    }

    public class inheritedpereriv: BaseClass
    {

    }




Программа

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
   static void Main(string[] args)
        {

            HashSet<BaseClass> abstractHash = new HashSet<BaseClass>();

            abstractHash.Add(new inheritedjob() {  InWork =true, strt_time = DateTime.Now });
            abstractHash.Add(new inheritedjob() {  strt_time =DateTime.Today});
            abstractHash.Add(new inheritedjob());
            abstractHash.Add(new inheritedjob());
            abstractHash.Add(new inheritedjob() { InWork = true });

            abstractHash.Add(new inheritedpereriv());
            abstractHash.Add(new inheritedpereriv() );
            abstractHash.Add(new inheritedpereriv());
            abstractHash.Add(new inheritedpereriv());

            var d2 = abstractHash.OfType<inheritedjob>().
                Where(p=>p.InWork);

        }
...
Рейтинг: 0 / 0
Посоветуйте по архитектуре классов
    #39528187
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_sub,
В наследниках нужно повторить методы базового.
Наследник РАСШИРЯЕТ функционал
...
Рейтинг: 0 / 0
Посоветуйте по архитектуре классов
    #39528195
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а зачем тут HashSet?
Вы создаете ссылочные типы данных, то есть классы.
Шек класса, если он явно не определен, это указатель на объект. То есть для всех созданных объектов, хеш всегда будет разный. Шеб будет одинаковый, только если вы попытаетесь добавить 2 раза один и тот же инстанс (объект). Но если создать 2 разных объекта с одинаковыми полями\свойствами, то их хеши будут отличаться.
возникает вопрос, нафига тогда хешсет?
...
Рейтинг: 0 / 0
Посоветуйте по архитектуре классов
    #39528198
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шек = хеш, меня немного плющит
...
Рейтинг: 0 / 0
Посоветуйте по архитектуре классов
    #39528209
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,
я вынес в базовый класс все общие свойства, чтобы избежать их дублирования в наследниках.
...
Рейтинг: 0 / 0
Посоветуйте по архитектуре классов
    #39528210
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,

HashSet выбрал только из принципа удовлетворения минимальной требуемой функциональности- вроде как побыстрее чем List.
...
Рейтинг: 0 / 0
Посоветуйте по архитектуре классов
    #39528237
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_subPetro123,
я вынес в базовый класс все общие свойства, чтобы избежать их дублирования в наследниках.
Не будет полиморфизма. Дело ваше.
vb_subпобыстрее
?
...
Рейтинг: 0 / 0
Посоветуйте по архитектуре классов
    #39528249
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Посоветуйте по архитектуре классов
    #39528255
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_sub https://stackoverflow.com/questions/150750/hashset-vs-list-performancePetro123,
У программистов поговорка - не оптимизируй раньше времени.
...
Рейтинг: 0 / 0
Посоветуйте по архитектуре классов
    #39528274
Фотография Roslyn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_subи также использовать те же linq to object, как и раньше, только игнорируя объекты типа pereriv в Hasset.
Что можно сделать, только будет выглядеть по костыльному.

по костыльному не будет, если игнорировать так:

hashSet.OfType<Job>()

если проблема заключается только в том, что хранить надо в одном хешсете, а linq выполнять только над Job - надо делать враппер над хешсетом. Который, будет предоставлять дополнительно отфильтровывать
...
Рейтинг: 0 / 0
Посоветуйте по архитектуре классов
    #39528293
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roslyn,
так и сделал.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Посоветуйте по архитектуре классов
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]