9 / 9 / 2
Регистрация: 27.03.2012
Сообщений: 79
1

Объединение 2-х списков по ID

22.09.2015, 18:55. Показов 1537. Ответов 4
Метки нет (Все метки)

Здравствуйте! Нужна помощь в объединение списков

Есть 2 List-а
List<object[]> list_1
и
List<object[]> list_2
оба заполнены разными данными.
И в первом и во втором списке первый элемент ([0]) это ID

Нужно объединить их по данному ID.

В итоге должно получиться так:

Если List_1 содержит 3 записи:
{10, 55, "Text1"}
{5, 534, "Text2"}
{6, 15, "Text3"}

а второй:
{5, 0, 8, 1500}

То результирующий список должен содержать:
{10, 55, "Text1", 0, 0, 0}
{5, 534, "Text2", 0, 8, 1500}
{6, 15, "Text3", 0, 0, 0}

Буду рад любой помощи!
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.09.2015, 18:55
Ответы с готовыми решениями:

Объединение 2 и более списков в список списков по индексу без использования циклов
Уважаемые товарищи, подскажите есть ли способ объединения 2 и более списков в список списков по...

Объединение списков
Здравствуйте,кто нибуть помогите пожайлуста решить задачу по объединению списков: нужно написать...

Объединение списков
Подскажите как решить,с помошью чего?)))Примерно хоть)Имеется список женихов и список невест....

Объединение списков
Дано: - большое количество файлов со строками - строки не повторяются в одном конкретном файле,...

4
Эксперт .NET
5461 / 4233 / 1209
Регистрация: 12.10.2013
Сообщений: 12,224
Записей в блоге: 2
22.09.2015, 19:42 2
Цитата Сообщение от Source-of-life Посмотреть сообщение
Буду рад любой помощи!
В первую очередь, ятд, следовало бы подумать о том, чтобы уйти от object и использовать строгую типизацию. Создать, к примеру, свой класс с полями для хранения данных.
0
127 / 121 / 68
Регистрация: 27.08.2015
Сообщений: 232
22.09.2015, 20:28 3
Source-of-life, по-хорошему действительно нужно воспользоваться советом insite2012. Ну а если у вас всё же сохранится первоначальная формулировка, тогда можно сделать так:
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
78
79
80
81
82
83
84
85
86
87
88
89
90
    class Program
    {
        static void Main(string[] args)
        {
            // Заполняем списки тестовыми данными.
            List<object[]> list_1 = new List<object[]>();
            list_1.Add(new object[] {10, 55, "Text1"} );
            list_1.Add(new object[] {5, 534, "Text2"} );
            list_1.Add(new object[] {6, 15, "Text3"} );
 
            List<object[]> list_2 = new List<object[]>();
            list_2.Add(new object[] { 5, 0, 8, 1500 } );
 
            // Основная функция объединения списков.
            List<object[]> list_3 = MergeLists(list_1, list_2);
            PrintList(list_3);
        }
 
        private static List<object[]> MergeLists(List<object[]> list_1, List<object[]> list_2)
        {
            // Воспользуемся вспомогательным словарём. Ключ - целое число
            // (первый элемент массива object[]), значение для каждого ключа - объединённые
            // массивы. Первый элемент такого списка (ArrayList) совпадает со значением ключа,
            // далее идут объединённые данные.
            Dictionary<int, ArrayList> dict = new Dictionary<int, ArrayList>();
            AddListToDictionary(dict, list_1);
            AddListToDictionary(dict, list_2);
 
            // Списки в словаре должны иметь одинаковую длину. Вычисляем размер и
            // при необходимости дозаполняем нулями.
            int maxArrayLength = 0;
            foreach (int key in dict.Keys)
            {
                maxArrayLength = Math.Max(dict[key].Count, maxArrayLength);
            }
 
            foreach (int key in dict.Keys)
            {
                AppendZerosToMaxLength(dict[key], maxArrayLength);
            }
 
            // Выпихиваем данные в "изначальном" формате.
            List<object[]> res = new List<object[]>();
            foreach (int key in dict.Keys)
            {
                res.Add(dict[key].ToArray());
            }
            return res;
        }
 
        private static void AddListToDictionary(Dictionary<int, ArrayList> dict, List<object[]> lst)
        {
            for (int i = 0; i < lst.Count; ++i)
            {
                int key = (int)(lst[i][0]); // Ключ - первый элемент массива.
                if (!dict.ContainsKey(key))
                {
                    dict[key] = new ArrayList(lst[i]); // Первая встреча - полностью копируем массив.
                }
                else
                {
                    // Не первая встреча, не копируем ведущий ключ.
                    for (int j = 1; j < lst[i].Length; ++j)
                    {
                        dict[key].Add(lst[i][j]);
                    }
                }
            }
        }
 
        private static void AppendZerosToMaxLength(ArrayList arr, int totalLength)
        {
            if (arr.Count < totalLength)
            {
                int left = totalLength-arr.Count;
                for (int i = 0; i < left; ++i)
                {
                    arr.Add(0);
                }
            }
        }
 
        private static void PrintList(List<object[]> lst)
        {
            for (int i = 0; i < lst.Count; ++i)
            {
                Console.WriteLine(String.Join(", ", lst[i]));
            }
        }
    }
0
Администратор
Эксперт .NET
15248 / 12287 / 4904
Регистрация: 17.03.2014
Сообщений: 24,883
Записей в блоге: 1
22.09.2015, 23:24 4
Source-of-life, Если list_2 можно менять, то можно вот так сделать:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
List<object[]> list_1 = new List<object[]>();
list_1.Add(new object[] {10, 55, "Text1"} );
list_1.Add(new object[] {5, 534, "Text2"} );
list_1.Add(new object[] {6, 15, "Text3"} );
 
List<object[]> list_2 = new List<object[]>();
list_2.Add(new object[] { 5, 0, 8, 1500 } );
 
List<object[]> result = list_1.Select(arr1 => {
        object[] sameId = list_2.Find(arr2 => (int)arr1[0] == (int)arr2[0]);
        if (sameId == null) return arr1;
        list_2.Remove(sameId);
        return arr1.Concat(sameId.Skip(1)).ToArray();
    }).Concat(list_2).ToList();
0
1146 / 738 / 483
Регистрация: 21.01.2014
Сообщений: 1,903
23.09.2015, 02:02 5
А это не подходит?
C#
1
var res = list_1.Join(list_2, (o) => o[0], (o) => o[0], (o1, o2) => o1.Concat(o2.Skip(1)).ToArray());
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.09.2015, 02:02
Помогаю со студенческими работами здесь

Объединение списков
Суть. Есть 2 списка. К примеру - l1 = l2= Нужно получить 3-ий, следующего вида l1*f(l2) На ум...

Объединение списков
DOMAINS spisok = integer* PREDICATES obed(spisok,spisok,spisok) peresech(integer,spisok)...

Объединение списков
Здравствуйте, помогите решить задачи по объединению списков: 1) Сформировать список - объединение...

Объединение списков
Добрый день, не понимаю как правильно решить в SWI-Prolog Есть элементарная задача: /*...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru