0 / 0 / 0
Регистрация: 07.10.2018
Сообщений: 11
1
.NET 4.x

Объединение двух списков List<string>

18.12.2018, 11:43. Показов 1765. Ответов 2
Метки нет (Все метки)

Есть 2 списка Schedule И Changes.
В каждом есть несколько элементов вида №. Lesson Group|Cab (пример: 1. Математика И-10|407).

Нужно объединить эти 2 списка по принципу - если в Changes есть элемент с № таким же как в Schedule - то этот элемент Schedule заменяется на Changes И если в Schedule нет элемента с № из Changes, тот этот элемент Changes добавляется в Schedule.

пока получилось сделать это так
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
for (int i = 0; i < Changes.Count(); i++)
            {
                bool NotContains = false;
                for (int k = 0; k < Schedule.Count(); k++)
                {
                    if (Changes[i][0] == Schedule[k][0])
                    {
                        Schedule[k] = Changes[i];
                        NotContains = false;
                    }
                    else
                    {
                        NotContains = true;
                    }
                    if (NotContains == true)
                    {
                        Schedule.Add(Changes[i]);
                        NotContains = false;
                    }
                }
            }
Но по итогу, если в Changes несколько элементов, то получаю несколько повторяющихся элементов в результате например:

2. Иностранный язык
П-1 | 413
1. Астрономия
ПК-1 | Спортзал
3. Русский язык и культура речи
ИСП-1 | 407
3. Русский язык и культура речи
ИСП-1 | 407
4. Литература
ИС-1 | С-3
4. Литература
ИС-1 | С-3
4. Литература
ИС-1 | С-3
4. Литература
ИС-1 | С-3

Решил это дело костылем - просто убираю повторяющиеся элементы, но все же это костыль...
Немогу додумать как реализовать это не прибегая к подобным костылям?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.12.2018, 11:43
Ответы с готовыми решениями:

List<string, string, string> есть ли в C# что-то подобное?
Мне надо добавить в List не только имя файла, но и некоторые строки из этого файла. Т.е. например,...

List<string> C#
как реализовать быстрое сохранение списка строк? имеется список из примерно 90 строк (может быть...

Элемент управления для List<String>
Привет! Какой элемент управления есть в НЕТ для управления списком строк. Чтобы можно было...

Сериализация List<string> без переноса строк
Есть класс SettingsList. Мне нужно сериализовать такое вот поле класса: private List&lt;string&gt;...

2
1087 / 830 / 490
Регистрация: 09.04.2014
Сообщений: 1,966
18.12.2018, 13:51 2
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Dictionary<string, int> dictionary = new Dictionary<string, int>(Schedule.Count);
            for (int i = 0; i < Schedule.Count; i++)
            {
                var key = GetKey(Schedule[i]);
                dictionary[key] = i;
            }
            foreach (var item in Changes)
            {
                var key = GetKey(item);
                if (dictionary.TryGetValue(key, out int index))
                    Schedule[index] = item;
                else
                {
                    Schedule.Add(item);
                    dictionary[key] = Schedule.Count - 1;
                }
            }
C#
1
2
3
4
5
6
7
8
static string GetKey(string str)
        {
            int pos = str.IndexOf('.');
            if (pos > -1)
                return str.Substring(0, pos);
            else
                return "";
        }
0
70 / 44 / 28
Регистрация: 14.02.2017
Сообщений: 126
18.12.2018, 15:51 3
Добрый день!

Постепенно и подробно, хотя и неэффективно)))
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Regul2
{
    class Program
    {
        //может и туповато, но искренне
        //объявляем классы
        public class Changes
        {
            public int Number { get; set; }
            public string Lesson { get; set; }
            public string Group { get; set; }
            public int Cab { get; set; }
        }
 
        public class Schedule
        {
            public int Number { get; set; }
            public string Lesson { get; set; }
            public string Group { get; set; }
            public int Cab { get; set; }
        }
 
 
        static void Main(string[] args)
        {
            
            // формируем списки
            List<Changes> change = new List<Changes>()
            {
                new Changes { Number = 1, Lesson = "Философия", Group = "Ш1", Cab = 100 },
                new Changes { Number = 2, Lesson = "Литература", Group = "Ш2", Cab = 200 },
                new Changes { Number = 3, Lesson = "Русский язык", Group = "Ш3", Cab = 300 },
                new Changes { Number = 5, Lesson = "Информатика", Group = "Ш4", Cab = 400 }                
            };
            List<Schedule> schedule = new List<Schedule>()
            {
                new Schedule { Number = 1, Lesson = "Математика", Group = "Ш11", Cab = 100 },
                new Schedule { Number = 6, Lesson = "Физкультура", Group = "Ш2", Cab = 200 },
                new Schedule { Number = 9, Lesson = "Ботаника", Group = "Ш31", Cab = 300 },
                new Schedule { Number = 3, Lesson = "Иностранный", Group = "Ш4", Cab = 400 }
            };
 
 
            //формируем список из элементов change, совпадающих по номеру с элементами schedule - здесь №1 и №3
            var result = from el in change
                         join n in schedule on el.Number equals n.Number
                         select new { Number = el.Number, Lesson = el.Lesson, Group = el.Group, Cab = el.Cab };
            //формируем список из элементов change, отсутствующих в schedule - здесь №2 и №5
            var result1 = from el in change
                          where !(from x in schedule select x.Number).Contains(el.Number)
                          select new { Number = el.Number, Lesson = el.Lesson, Group = el.Group, Cab = el.Cab };
            //формируем список из элементов schedule, отсутствующих в change - здесь №6 и №9
            var result2 = from el in schedule
                          where !(from x in change select x.Number).Contains(el.Number)
                          select new { Number = el.Number, Lesson = el.Lesson, Group = el.Group, Cab = el.Cab };                  
            //объединяем списки и сортируем по порядку номеров
            var total = from m in result.Concat(result1).Concat(result2)
                              orderby m.Number
                              select m;
            //выводим на консоль элементы объединенного списка total
            foreach (var item in total)
                Console.WriteLine($"№{item.Number}. {item.Lesson} {item.Group}|{item.Cab}");
 
            Console.ReadKey();
 
        }
    }
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.12.2018, 15:51
Помогаю со студенческими работами здесь

Передача и принятие объекта List<string> через StreamWriter и StreamReader
Имеется 2 программы: клиент и сервер. Сообщения строковые передаются без проблем, все получается, а...

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

Объединение действий двух checkBox
Вот такая ситуация. Есть форма, на ней: - текстовое поле (textBox1); - переключатели типа...

Объединение двух *.xls файлов
Здравствуйте, уважаемые формульчане! Возникла проблема с объдинением двух различных *.xls файлов....


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

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

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