С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
6 / 6 / 2
Регистрация: 19.02.2013
Сообщений: 68

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

19.09.2019, 11:16. Показов 2465. Ответов 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
1483 / 938 / 454
Регистрация: 06.02.2012
Сообщений: 2,868
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
 Аватар для Элд Хасп
16119 / 11244 / 2887
Регистрация: 21.04.2018
Сообщений: 33,063
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru