Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/25: Рейтинг темы: голосов - 25, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 27.04.2022
Сообщений: 2

Объединить 2 массива в коллекцию, исключая дубляжи

27.04.2022, 09:59. Показов 5504. Ответов 6

Студворк — интернет-сервис помощи студентам
Добрый день! Подскажите пожалуйста решение.
Есть два массива строк. Надо их объединить в одну коллекцию, исключив повторения, не используя Linq.
Пример: {1, 2, 1} + {3, 2} => {1, 2, 3}.

Первым способом: добавляю сначала оба массива в List через AddRande. Далее при помощи вложенных циклов перебираю List, с условием на равенство i с j удаляю j. Вроде выходит, но стоит добавить еще пару повторяющихся элементов, как один из них не удаляется и на выходе остается дубликат.
Подскажите, может этот способ негодный или я что-то неправильно делаю?
Либо может сначала сравнивать массивы между собой, а потом добавлять по элементу в List?
Еще можно Hashset'ом убрать дубляж из листа, но не могу разобраться как.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.04.2022, 09:59
Ответы с готовыми решениями:

Объединить два одномерных массива и напечатать коллекцию
Добрый день. Даны две строки, которые необходимо распарсить в массивы. После чего передать каждый элемент массива конкретному свойству из...

Объединить массивы исключая повторения
дано два массива 1. (1, 2, 3, 5) 2. (2, 4, 5, 6) как сделать так чтобы в 3 массиве получилось (1, 2, 3, 4, 5, 6), то есть в третий...

Коллекцию строк объединить в строку
Здравствуйте, уважаемые участники форума. Решите, пожалуйста, задачу. В тело программы вставлен копипастом столбик разных...

6
 Аватар для iLinks
800 / 458 / 237
Регистрация: 03.01.2017
Сообщений: 1,339
27.04.2022, 12:19
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
static void Distinct(ref int[] arr)
{
    for (int i = 0; i < arr.Length; i++)
    {
        for (int j = i + 1; j < arr.Length; j++)
        {
            if (arr[i] == arr[j])
            {
                for (int k = j; k < arr.Length; k++)
                {
                    if (k + 1 < arr.Length)
                    {
                        (arr[k], arr[k + 1]) = (arr[k + 1], arr[k]);
                    }
                }
                Array.Resize(ref arr, arr.Length - 1);
                if (j == arr.Length - 1 && arr[i] == arr[j])
                {
                    Array.Resize(ref arr, arr.Length - 1);
                }
            }
        }
    }
}
static void Main(string[] args)
{
    Random random = new Random();
    int[] arr1 = new int[random.Next(1, 10)];
    int[] arr2 = new int[random.Next(1, 10)];
    int[] arr3 = new int[arr1.Length + arr2.Length];
    for (int i = 0; i < arr1.Length; i++)
    {
        arr1[i] = random.Next(1, 9);
    }
    for (int i = 0; i < arr2.Length; i++)
    {
        arr2[i] = random.Next(1, 9);
    }
    Console.WriteLine("Массив 1:\n" + string.Join(" ", arr1));
    Console.WriteLine("Массив 2:\n" + string.Join(" ", arr2));
    Array.ConstrainedCopy(arr1, 0, arr3, 0, arr1.Length);
    Array.ConstrainedCopy(arr2, 0, arr3, arr1.Length, arr2.Length);
    Console.WriteLine("Массив 3:\n" + string.Join(" ", arr3));
    Distinct(ref arr3);
    Console.WriteLine("Массив 3 после зачистки дублей:\n" + string.Join(" ", arr3));
    Console.ReadLine();
}
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,111
Записей в блоге: 2
27.04.2022, 12:42
Цитата Сообщение от EvgeniyS Посмотреть сообщение
Объединить 2 массива в коллекцию
В какого типа коллекцию?
Если предположить последовательности любого типа, то это должны быть IEnumerable.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    public static partial class ExtensionMethods
    {
 
        public static IEnumerable<T> Union<T>(this IEnumerable<T> first, IEnumerable<T> second)
        {
            HashSet<T> hs = new HashSet<T>();
 
        loop:
            foreach (T item in first)
            {
                if (hs.Contains(item))
                    continue;
                hs.Add(item);
                yield return item;
            }
            if (first != second)
            {
                first = second;
                goto loop;
            }
        }
C#
1
2
3
var list1 = new List<int>() {1, 2, 1};
var list2 = new List<int>() {3, 2};
var list3 = list1.Union(list2).ToList();
Если предположить, что все коллекции это List и нельзя использовать HashSet:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        public static List<T> Union<T>(this List<T> first, List<T> second)
        {
            List<T> list = new List<T>(first.Count + second.Count);
 
        loop:
            foreach (T item in first)
            {
                if (list.Contains(item))
                    continue;
                list.Add(item);
            }
            if (first != second)
            {
                first = second;
                goto loop;
            }
            return list;
        }
И изменится получение нового листа - не нужен метод ToList():
C#
3
var list3 = list1.Union(list2);
1
 Аватар для iLinks
800 / 458 / 237
Регистрация: 03.01.2017
Сообщений: 1,339
27.04.2022, 13:09
Цитата Сообщение от Элд Хасп Посмотреть сообщение
все коллекции это List и нельзя использовать HashSet
Элд Хасп, а еще Linq нельзя использовать.
Это можно представить, что ты сидишь за кухонным столом, перед тобой еда, но тебе нельзя ее есть.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,111
Записей в блоге: 2
27.04.2022, 13:17
Цитата Сообщение от iLinks Посмотреть сообщение
а еще Linq нельзя использовать.
Ну, так в методах нет использования LINQ.
LINQ есть только в первом примере использования, когда и IEnumerable создаётся лист: list3 = list1.Union(list2).ToList();
.
Да, и то можно заменить на:
C#
3
var list3 = new List<int>(list1.Union(list2));
Во втором варианте - из метода сразу возвращается лист.
0
0 / 0 / 0
Регистрация: 27.04.2022
Сообщений: 2
27.04.2022, 14:49  [ТС]
2 одномерных массива int[] array = { 1, 2, 1} и int[] array2 = {3, 2} объединить в коллекцию List<int> без дубликатов.
Не использовать Linq.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,111
Записей в блоге: 2
27.04.2022, 16:43
Лучший ответ Сообщение было отмечено EvgeniyS как решение

Решение

Цитата Сообщение от EvgeniyS Посмотреть сообщение
2 одномерных массива int[] array = { 1, 2, 1} и int[] array2 = {3, 2} объединить в коллекцию List<int> без дубликатов.
Не использовать Linq.
Тогда можно использовать вторую перегрузку, только изменить тип параметров, что бы принимал массивы:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        public static List<T> Union<T>(this IList<T> first, IList<T> second)
        {
            List<T> list = new List<T>(first.Count + second.Count);
 
        loop:
            foreach (T item in first)
            {
                if (list.Contains(item))
                    continue;
                list.Add(item);
            }
            if (first != second)
            {
                first = second;
                goto loop;
            }
            return list;
        }
Такой метод для больших множеств может работать медленно, так как на каждой итерации метод list.Contains будет проходит полностью по всей коллекции.
Более быстрым будет добавление временного HashSet<int>, если это разрешено заданием.

Добавлено через 2 минуты
В первой перегрузке тоже не используется LINQ, если результирующий лист получать так:
C#
1
var list3 = new List<int>(list1.Union(list2));
Добавлено через 1 минуту
Если смущает название метода Union из-за наличия такого же в LINQ, то поменяйте название на любое устраивающее вас.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.04.2022, 16:43
Помогаю со студенческими работами здесь

Дубляжи в операторе JOIN
Приветствую. Начал изучать MySql. И столкнулся с такой проблемой, что при склеивании таблиц, и фильтре по параметру, у меня выводится...

Добавить в конец массива элементы, расположенные между min и max элементами исходного массива, исключая нули
добавить в конец массива элементы, расположенные между минимальными и максимальными элементами исходного массива, исключая нулевые

Найти сумму элементов массива, исключая заданный интервал
Дан массив размера N и целые числа K и L (1 &lt; K ≤ L ≤ N). Найти сумму всех элементов массива, кроме элементов с номерами от K до L...

Найти сумму всех элементов массива, исключая экстремальные
Найти сумму всех элементов массива, исключая экстремальные. Значением этой суммы заменить второй и предпоследний элементы исходного...

Выборка из массива, исключая заданный по индексу элемент (LINQ)
Здравствуйте, подскажите пожалуйста, как можно выбрать элементы из массива, исключая элемент с некоторым заданным индексом, используя LINQ?...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью в КА2. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа в КА2. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru