Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Посоветуйте по архитектуре классов / 16 сообщений из 16, страница 1 из 1
28.09.2017, 19:24
    #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
28.09.2017, 21:49
    #39527948
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Посоветуйте по архитектуре классов
vb_subОднако во всех случаях приходил к тому, что необходимо в классе pereriv доопределять все недостающие свойства до класса job, хотя в нем они не нужны.

Так и не понял чем базовый класс или интерфейс не устроили.
...
Рейтинг: 0 / 0
28.09.2017, 22:13
    #39527961
LR
LR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Посоветуйте по архитектуре классов
vb_subЧто можно сделать, только будет выглядеть по костыльному.
...
2) Переписать все linq запросы в 2 уровня- сначала отфильтровываем из HashSet только job, а к нему применяем уже "старый" linq запрос.
А в чем костыль?
...
Рейтинг: 0 / 0
28.09.2017, 23:17
    #39527982
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Посоветуйте по архитектуре классов
я бы на вашем месте задумался о том, что я делаю не так, если у меня возникают подобные сложности.
класс может наследовать множество интерфейсов. то есть можно в интерфейсе определить 1 поле, в другом другое и дёргать их через эти интерфейсы.
...
Рейтинг: 0 / 0
29.09.2017, 08:23
    #39528068
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Посоветуйте по архитектуре классов
vb_sub,
- если отделять в коллекциях по признаку, то врооде linq...where есть.
- если использовать список для чего то полезного, тогда интерфейс не нужен для полиморфизма. Наследование нужно. ООП.
...
Рейтинг: 0 / 0
29.09.2017, 11:37
    #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
29.09.2017, 11:43
    #39528187
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Посоветуйте по архитектуре классов
vb_sub,
В наследниках нужно повторить методы базового.
Наследник РАСШИРЯЕТ функционал
...
Рейтинг: 0 / 0
29.09.2017, 11:51
    #39528195
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Посоветуйте по архитектуре классов
а зачем тут HashSet?
Вы создаете ссылочные типы данных, то есть классы.
Шек класса, если он явно не определен, это указатель на объект. То есть для всех созданных объектов, хеш всегда будет разный. Шеб будет одинаковый, только если вы попытаетесь добавить 2 раза один и тот же инстанс (объект). Но если создать 2 разных объекта с одинаковыми полями\свойствами, то их хеши будут отличаться.
возникает вопрос, нафига тогда хешсет?
...
Рейтинг: 0 / 0
29.09.2017, 11:53
    #39528198
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Посоветуйте по архитектуре классов
Шек = хеш, меня немного плющит
...
Рейтинг: 0 / 0
29.09.2017, 12:01
    #39528209
vb_sub
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Посоветуйте по архитектуре классов
Petro123,
я вынес в базовый класс все общие свойства, чтобы избежать их дублирования в наследниках.
...
Рейтинг: 0 / 0
29.09.2017, 12:03
    #39528210
vb_sub
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Посоветуйте по архитектуре классов
Roman Mejtes,

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

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

hashSet.OfType<Job>()

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


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