6 / 6 / 2
Регистрация: 19.02.2013
Сообщений: 68

LINQ запрос в List<object> хранящий разные типы

19.09.2019, 11:16. Показов 2540. Ответов 5

Студворк — интернет-сервис помощи студентам
Собственно, есть два класса, экземпляры которых хранятся в одном общем контейнере как object.Задача получить необходимые данные при помощи linq запроса.

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

Собственно вот моя реализация:
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
42
43
44
class Clodes
    {
        public int Id;
    }
 
    class Outerwear : Clodes
    {
        public string name;
        public int size;
        public int height;
    }
 
    class Footwear : Clodes
    {
        public string name;
        public int size;
    }
 
List<object> BD = new List<object>();
 
    static List<object> found_for_size(int size, List<object> BD) //поиск по размеру
        {
            List<object> a = new List<object>();
            List<Outerwear> out1 = new List<Outerwear>();
            List<Footwear> foot1 = new List<Footwear>();
 
            for (int i = 0; i < BD.Count ; i++)
            {
                if (BD[i] is Outerwear) out1.Add((Outerwear)BD[i]);
                if (BD[i] is Footwear) foot1.Add((Footwear)BD[i]);
            }
 
            var clodes = from i in out1
                         where (i.size > size) // ставим нужное нам условие
                         orderby i.size //упорядочиваем по возрастанию, если нужно, то можно менять тип сортировки
                         select i;
            var clodes1 = from j in foot1
                          where (j.size > size)
                          orderby j.size
                          select j;
            foreach (var k in clodes) a.Add((object)k);
            foreach (var k in clodes1) a.Add((object)k);
            return a;
        }
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.09.2019, 11:16
Ответы с готовыми решениями:

Запрос LINQ к List, как выбрать определенный элемент из списка
Подскажите как выбрать определенный элемент из списка? public class PostTarif { public double Weight {...

Linq to Xml запрос, где обьект имеет List обьектов другого класса
есть классы public class Worker { public List&lt;EducationDuringWorking&gt; EducationsDuringWorking { get; set; } //... } ...

Linq преобразование List<List<double>> в List<Array>
Доброго времени суток, данный код нужно преобразовать linq выражениями и дописать выборку из List&lt;List&lt;double&gt;&gt;. Таким...

5
 Аватар для Lexeq
1151 / 743 / 483
Регистрация: 21.01.2014
Сообщений: 1,903
19.09.2019, 12:00
Vyzov, сделайте name и size полями clodes, и храните свои объекты в List<Clodes>. Если вам надо в листе базового класса, проверять типы на конкретно наследника, то вы скорее всего либо неправильно составили иерархию, либо храните не то не там.
2
6 / 6 / 2
Регистрация: 19.02.2013
Сообщений: 68
19.09.2019, 12:12  [ТС]
Мне нужно симулировать работу с базой данных, без базы данных... Собственно, у меня есть две реализации, в одной база представляет собой структуру с "таблицами" в качестве которых выступают два List'a с нужными типами, И вот эта, где все элементы хранятся в одном контейнере, приведенные к object. Ну и нужно реализовать поиск, сортировку и т.д. и т.п. Дурь конечно, но я этим уже одиннадцатый час страдаю XD
0
 Аватар для Kazbek17
1484 / 939 / 454
Регистрация: 06.02.2012
Сообщений: 2,869
19.09.2019, 12:51
Цитата Сообщение от Vyzov Посмотреть сообщение
Мне нужно симулировать работу с базой данных
Как то так
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
List<BaseClothes> DB = new List<BaseClothes>();
abstract class BaseClothes
        {
            public int Id { get; set; }
            public string name { get; set; }
            public int size { get; set; }
            public int price { get; set; }
 
            public abstract void Add(List<BaseClothes> list);
            public virtual List<BaseClothes> found_for_size(int size, List<BaseClothes> list)
            {
                var clodes = from i in list
                             where (i.size >= size)
                             orderby i.size 
                             select i;
             
                return clodes.ToList();
            }
        }
 
        class Footwear : BaseClothes
        {
            public override void Add(List<BaseClothes> list)
            {
                list.Add(this);
            }
            public override List<BaseClothes> found_for_size(int size, List<BaseClothes> list)
            {
                return base.found_for_size(size, list);
            }
 
        }
 
        class Outerwear: BaseClothes
        {
            public override void Add(List<BaseClothes> list)
            {
                list.Add(this);
            }
            public override List<BaseClothes> found_for_size(int size, List<BaseClothes> list)
            {
                return base.found_for_size(size, list);
            }
 
        }
 
private void Button2_Click(object sender, EventArgs e)
        {
 
            BaseClothes baseClothes = new Footwear();
            baseClothes.Id = 1;
            baseClothes.name = "Шлепки";
            baseClothes.size = 52;
            baseClothes.price = 450;
            baseClothes.Add(DB);
 
            baseClothes = new Footwear();
            baseClothes.Id = 2;
            baseClothes.name = "Тапочки";
            baseClothes.size = 41;
            baseClothes.price = 750;
            baseClothes.Add(DB);
 
            baseClothes = new Outerwear();
            baseClothes.Id = 3;
            baseClothes.name = "Пиджак";
            baseClothes.size = 52;
            baseClothes.price = 5450;
            baseClothes.Add(DB);
 
            List<BaseClothes> result = baseClothes.found_for_size(52, DB);
            foreach(BaseClothes item in result)
            {
                Console.WriteLine($"ID:{item.Id}|Название:{item.name}|Размер:{item.size}|Цена:{item.price}");
            }
 
        }
0
 Аватар для Lexeq
1151 / 743 / 483
Регистрация: 21.01.2014
Сообщений: 1,903
19.09.2019, 14:08
Vyzov, конкретно ваш код можно упростить до такого:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    static List<object> found_for_size(int size, List<object> BD) //поиск по размеру
        {
            var outs = BD.Where(i=>i is Outerwear)
                        .Select(i => (Outerwear)i)
                        .Where(o => o.size > size)
                        .OrderBy(o => o.size);
            var foots = BD.Where(i=>i is Footwear)
                        .Select(i => (Footwear)i)
                        .Where(f => f.size > size)
                        .OrderBy(f => f.size);
            List<object> a = new List<object>(outs);    
            a.AddRange(foots);
            return a;
        }
ну а вообще менять подход надо.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16150 / 11271 / 2890
Регистрация: 21.04.2018
Сообщений: 33,142
Записей в блоге: 2
19.09.2019, 15:08
Цитата Сообщение от Vyzov Посмотреть сообщение
Собственно вот моя реализация:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Clodes
    {
        public int Id;
    }
    class ClodesSizeName : Clodes
    {
        public string name;
        public int size;
    }
    class Outerwear : ClodesSizeName
    {
        public int height;
    }
 
    class Footwear : ClodesSizeName {}
 
    static List<ClodesSizeName> found_for_size(int size, List<object> BD) //поиск по размеру
         =>BD.OfType<ClodesSizeName>().Where(item => item.size > size).OrederBy(item => item.size).ToList();
Или через интерфейс
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Clodes
    {
        public int Id;
    }
    interface ISize
    {
       int size;
    }
    class Outerwear : Clodes, ISize
    {
        public string name;
        public int size;
         public int height;
    }
 
    class Footwear : Clodes , ISize
    {
        public string name;
        public int size;
     }
 
    static List<ISize> found_for_size(int size, List<object> BD) //поиск по размеру
         =>BD.OfType<ISize>().Where(item => item.size > size).OrederBy(item => item.size).ToList();
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.09.2019, 15:08
Помогаю со студенческими работами здесь

Универсальное преобразование List<object> -> List<MyClass>
Пытаюсь написать нечто универсальное для преобразования сущностей из БД (таблицы) в сущности C# (классы). /// &lt;summary&gt; ...

Как отобразить List<List<object>> в ListView
Здравствуйте всем! не могу разобраться: значит есть список списков List&lt;List&lt;object&gt;&gt; list(24 списка в списке). Как мне...

Конвертировать list<object> в list<string>
Здравствуйте форумчане. Возможно ли быстро конвертировать list&lt;object&gt; в list&lt;string&gt; и обратно. И ещё, возможно ли динамически задавать...

Преобразование List<MyClass> to List<Object>
собственно ловлю ошибку при преобразовании списка состоящего из экземпляров моего класса в List&lt;Object&gt; пытаюсь сделать такое ...

Вывод результатов группировки LINQ to Object
Добрый день! Есть запрос: var Link3 = lst1.GroupBy(c =&gt; new { ...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

Новые блоги и статьи
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определенном условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru