Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
 Посоветуйте по архитектуре классов  [new]
vb_sub
Member

Откуда:
Сообщений: 214
Всем привет, помогите плиз с советом.
Хочу хранить список разнородных объектов в HasSet и использовать linq для различных операций.
Однако у этих разнородных объектов есть одинаковые свойства. Думаю проще объяснить на примере.
Есть список(HasSet ) заданий(job) у которых есть следующие свойства

    public class job
        {
            public DateTime strt_time { get; set; }
            public DateTime fnl_date { get; set; }

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

Заполняем весь HasSet объектами класса job и получаем HasSet<job>. Можно применять linq без проблем ко всем свойствам объектов списка.
Теперь нужно добавить в этот HasSet другой объект только с 2 свойствами
    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, хотя в нем они не нужны.
Есть ли какое-либо рациональное решение для данной ситуации?
28 сен 17, 19:24    [20830053]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте по архитектуре классов  [new]
hVostt
Member

Откуда:
Сообщений: 11402
vb_sub
Однако во всех случаях приходил к тому, что необходимо в классе pereriv доопределять все недостающие свойства до класса job, хотя в нем они не нужны.


Так и не понял чем базовый класс или интерфейс не устроили.
28 сен 17, 21:49    [20830230]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте по архитектуре классов  [new]
LR
Member

Откуда: 8P8C
Сообщений: 2146
vb_sub
Что можно сделать, только будет выглядеть по костыльному.
...
2) Переписать все linq запросы в 2 уровня- сначала отфильтровываем из HashSet только job, а к нему применяем уже "старый" linq запрос.

А в чем костыль?
28 сен 17, 22:13    [20830294]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте по архитектуре классов  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 2275
я бы на вашем месте задумался о том, что я делаю не так, если у меня возникают подобные сложности.
класс может наследовать множество интерфейсов. то есть можно в интерфейсе определить 1 поле, в другом другое и дёргать их через эти интерфейсы.
28 сен 17, 23:17    [20830455]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте по архитектуре классов  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 29765
vb_sub,
- если отделять в коллекциях по признаку, то врооде linq...where есть.
- если использовать список для чего то полезного, тогда интерфейс не нужен для полиморфизма. Наследование нужно. ООП.
29 сен 17, 08:23    [20830743]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте по архитектуре классов  [new]
vb_sub
Member

Откуда:
Сообщений: 214
Roman Mejtes,
не так я делаю то, что хочу уместить в одном списке хоть и унаследованные от одного предка класса, но все таки разные.
В общем переделал следующим образом
Структура классов:
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
    {

    }



Программа

   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);

        }
29 сен 17, 11:37    [20831249]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте по архитектуре классов  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 29765
vb_sub,
В наследниках нужно повторить методы базового.
Наследник РАСШИРЯЕТ функционал
29 сен 17, 11:43    [20831277]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте по архитектуре классов  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 2275
а зачем тут HashSet?
Вы создаете ссылочные типы данных, то есть классы.
Шек класса, если он явно не определен, это указатель на объект. То есть для всех созданных объектов, хеш всегда будет разный. Шеб будет одинаковый, только если вы попытаетесь добавить 2 раза один и тот же инстанс (объект). Но если создать 2 разных объекта с одинаковыми полями\свойствами, то их хеши будут отличаться.
возникает вопрос, нафига тогда хешсет?
29 сен 17, 11:51    [20831303]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте по архитектуре классов  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 2275
Шек = хеш, меня немного плющит
29 сен 17, 11:53    [20831310]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте по архитектуре классов  [new]
vb_sub
Member

Откуда:
Сообщений: 214
Petro123,
я вынес в базовый класс все общие свойства, чтобы избежать их дублирования в наследниках.
29 сен 17, 12:01    [20831339]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте по архитектуре классов  [new]
vb_sub
Member

Откуда:
Сообщений: 214
Roman Mejtes,

HashSet выбрал только из принципа удовлетворения минимальной требуемой функциональности- вроде как побыстрее чем List.
29 сен 17, 12:03    [20831343]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте по архитектуре классов  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 29765
vb_sub
Petro123,
я вынес в базовый класс все общие свойства, чтобы избежать их дублирования в наследниках.

Не будет полиморфизма. Дело ваше.
vb_sub
побыстрее

?
29 сен 17, 12:27    [20831395]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте по архитектуре классов  [new]
vb_sub
Member

Откуда:
Сообщений: 214
https://stackoverflow.com/questions/150750/hashset-vs-list-performancePetro123,
29 сен 17, 12:38    [20831430]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте по архитектуре классов  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 29765
vb_sub
https://stackoverflow.com/questions/150750/hashset-vs-list-performancePetro123,

У программистов поговорка - не оптимизируй раньше времени.
29 сен 17, 12:42    [20831441]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте по архитектуре классов  [new]
Roslyn
Member

Откуда:
Сообщений: 41289
vb_sub
и также использовать те же linq to object, как и раньше, только игнорируя объекты типа pereriv в Hasset.
Что можно сделать, только будет выглядеть по костыльному.


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

hashSet.OfType<Job>()

если проблема заключается только в том, что хранить надо в одном хешсете, а linq выполнять только над Job - надо делать враппер над хешсетом. Который, будет предоставлять дополнительно отфильтровывать
29 сен 17, 13:02    [20831505]     Ответить | Цитировать Сообщить модератору
 Re: Посоветуйте по архитектуре классов  [new]
vb_sub
Member

Откуда:
Сообщений: 214
Roslyn,
так и сделал.
29 сен 17, 13:15    [20831556]     Ответить | Цитировать Сообщить модератору
Все форумы / WinForms, .Net Framework Ответить