Форум программистов, компьютерный форум, киберфорум
LINQ
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
1 / 1 / 0
Регистрация: 02.05.2020
Сообщений: 2

Объединить две последовательности, которые имеют 2 одинаковых поля, в одну

02.05.2020, 00:52. Показов 2478. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть два класса. Первый класс - Product. Он описывает какой-то товар и имеет 3 поля:
1. store_name - название магазина
2. cost - цена товара
3. art - артикул товара.
Ниже приведен код описанного класса с полями и методом для заполнения List-a из элементов данного класса.

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 Product
    {
        public string store_name { get; set; }
        public int cost { get; set; }
        public int art { get; set; }
        
        public static List<Product> GenerateData()
        {
            var lst = new List<Product>();
            lst.Add(new Product { store_name = "a", cost = 10, art = 1 });
            lst.Add(new Product { store_name = "a", cost = 20, art = 2});
            lst.Add(new Product { store_name = "a", cost = 10, art = 3});
            lst.Add(new Product { store_name = "c", cost = 30, art = 4 });
            lst.Add(new Product { store_name = "b", cost = 50, art = 1 });
            lst.Add(new Product { store_name = "b", cost = 100, art = 2 });
            lst.Add(new Product { store_name = "b", cost = 70, art = 3});
            lst.Add(new Product { store_name = "c", cost = 60, art = 1 });
            lst.Add(new Product { store_name = "c", cost = 40, art = 2 });
            lst.Add(new Product { store_name = "c", cost = 20, art = 3 });
 
            return lst;
        }
    }
Второй класс - Buyer. Он описывает покупку, которая была совершена покупателем, и тоже имеет 3 поля:
1. code - код покупателя
2. art - артикул товара, который был куплен
3. store_name - название магазина, в котором был куплен товар

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Buyer
    {
        public int code { get; set; }
        public int art { get; set; }
        public string store_name { get; set; }
        public static List<Buyer> GenerateData()
        {
            var lst = new List<Buyer>();
            lst.Add(new Buyer { code = 1, art = 1, store_name = "a" });
            lst.Add(new Buyer { code = 1, art = 1, store_name = "a" });
            lst.Add(new Buyer { code = 1, art = 2, store_name = "b" });
            lst.Add(new Buyer { code = 2, art = 4, store_name = "c" });
            lst.Add(new Buyer { code = 3, art = 1, store_name = "c" });
            lst.Add(new Buyer { code = 3, art = 2, store_name = "c" });
            lst.Add(new Buyer { code = 3, art = 2, store_name = "b" });
            lst.Add(new Buyer { code = 4, art = 1,  store_name = "a" });
            lst.Add(new Buyer { code = 4, art = 2, store_name = "b" });
            lst.Add(new Buyer { code = 4, art = 3, store_name = "c" });
            return lst;
        }
Я хочу лист класса Buyer объединить с листом класса Product, в третий лист с четырьмя полями - store_name, art, code и cost.
Т.е, чтобы у каждого элемента листа класса Buyer появилось поле cost. Результирующий лист должен иметь вот такой вид:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static List<Buyer> GenerateData()
        {
            var lst = new List<Buyer>();
            lst.Add(new Buyer { code = 1, art = 1, cost = 10, store_name = "a" });
            lst.Add(new Buyer { code = 1, art = 1, cost = 10, store_name = "a" });
            lst.Add(new Buyer { code = 1, art = 2, cost = 100, store_name = "b" });
            lst.Add(new Buyer { code = 2, art = 4, cost = 30, store_name = "c" });
            lst.Add(new Buyer { code = 3, art = 1, cost = 60, store_name = "c" });
            lst.Add(new Buyer { code = 3, art = 2, cost = 40, store_name = "c" });
            lst.Add(new Buyer { code = 3, art = 2, cost = 100, store_name = "b" });
            lst.Add(new Buyer { code = 4, art = 1, cost = 10, store_name = "a" });
            lst.Add(new Buyer { code = 4, art = 2, cost = 100,store_name = "b" });
            lst.Add(new Buyer { code = 4, art = 3, cost = 20, store_name = "c" });
            return lst;
        }
Это нужно сделать с помощью LinQ. Я пытался использовать метод Join(), но с помощью этого метода можно объединять последовательности только по одному общему полю, а у меня общих полей два. Помогите, пожалуйста
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.05.2020, 00:52
Ответы с готовыми решениями:

Объединить две упорядоченные последовательности в одну,используя представление последовательности чисел в виде списка
помогите написать программу на паскале абс.Используя представление последовательности чисел в виде линейного списка,напишите программу...

Объединить две упорядоченные последовательности в одну
вот такая задача про одномерный массив 6. Заданы две упорядоченные по возрастанию последовательности из N чисел и М чисел. Составить...

Две упорядоченные по возрастанию последовательности объединить в одну
Даны две упорядоченные по возрастанию последовательности чисел X и Y размером m и n элементов соответственно (3&lt;=m, n&lt;=10000)....

1
1 / 1 / 0
Регистрация: 02.05.2020
Сообщений: 2
02.05.2020, 14:00  [ТС]
Проблему решил. Оказывается можно использовать составные ключи в методе Join. Тогда объединение двух последовательностей будет выглядеть так:

C#
1
2
3
4
5
6
7
8
9
10
11
List<Product> products = Product.GenerateData();
            List<Buyer1> buyer1s = Buyer1.GenerateData();
            var temp = buyer1s.Join(products, b => new { b.store_name, b.art }, k => new { k.store_name, k.art },
                (b, pr) => new
                {
                    Code = b.code,
                    Store = b.store_name,
                    Art = b.art,
                    Cost = pr.cost
                }
                );
Здесь мы используем составные ключи
C#
1
b => new { b.store_name, b.art }, k => new { k.store_name, k.art }
и объединяем два листа по совпадающим артикулам и названиям магазинов, а затем создаем новую выборку из объектов анонимного класса :
C#
1
2
3
4
5
6
7
(b, pr) => new
                {
                    Code = b.code,
                    Store = b.store_name,
                    Art = b.art,
                    Cost = pr.cost
                }
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.05.2020, 14:00
Помогаю со студенческими работами здесь

На плоскости заданы два круга с радиусами R1, R2 и координатами центров C1 (x1, y1), C2 (x2, y2), выяснить, имеют ли они: одну, две, не имеют общих то
Разработать программу для вычисления простого выражения, входные данные ввести в компонента Edit1, результат вывести в форматированном виде...

Объединить две проги в одну
вот еще один интересный вопрос имеется два кода по графике вопрос: как сделать из них одну, чтобы в начале программа просила выбрать...

Объединить две таблицы в одну
Как объединить по столбцу из каждой таблицы в два столбца одной таблицы?

Объединить две функции в одну
Здравствуйте! Я только учусь и у меня не очень пока получается. Помогите, пожалуйста, объединить две функции в одну, которая будет...

Объединить две подсети в одну
Здравствуйте! Подскажите, пожалуйста, как можно объединить две подсети в одну, например: 192.168.0.ххх и 192.168.1.ххх, так чтобы у них был...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru