Убрать из массива дубликаты без linq

76
10 апреля 2022, 23:00

Задача: реализовать метод Filter, который должен возвращать входной массив, в котором удалены элементы, которые встречаются более одного раза.

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

Если в массиве встречаются повторяющиеся значения, то они ВСЕ значения должны быть удалены.

Метод должен выбрасывать исключение ArgumentNullException в случае, если в метод передали null.

В решении разрешается использовать только конструкции языка. Использовать LINQ запрещено.

Сделал следующим образом, считал данные из исходного массива в HashSet<int> и числа которые повторяются добавил в List<int> после этого с помощью set.ExceptWith(list) убрал числа у которых были дубликаты.

public static int[] Filter(int[] source)
{
    if(source == null)
        throw new ArgumentNullException();
    var set = new HashSet<int>();
    var list = new List<int>();
    for (int i = 0; i < source.Length; i++)
    {
        if(!set.Add(source[i]))
            list.Add(source[i]);
    }
    set.ExceptWith(list);
    int[] newarray = new int[set.Count];
    set.CopyTo(newarray);
    return newarray;
}

Можно ли реализовать без помощи дополнительных структур данных? Только юзая массивы

Answer 1

Как-то так:

void Main()
{
    var source = new[] {1, 2, 3, 4, 3, 4,5};
    Filter(source).Dump();
}
// Define other methods and classes here
public static int[] Filter(int[] source)
{
    if (source == null)
        throw new ArgumentNullException(nameof(source));

    var result = new List<int>();
    for (int i = 0; i < source.Length; i++)
    {
        var currentElement = source[i];
        if (!source.HasDuplicateFor(currentElement))
            result.Add(currentElement);
    }
    return result.ToArray();
}
public static class MyExt
{
    public static bool HasDuplicateFor(this int[] source, int needle)
    {
        var counter = 0;
        for (int i = 0; i < source.Length; i++)
        {
            if (source[i] == needle)
                counter++;
        }
        return counter > 1;
    }
}

Вроде ничего Linq-шного не использовал, по факту HasDuplicateFor - это .Count из linq, просто записанный в классическом цикле for.

READ ALSO
Как обнаружить, что обои были изменены

Как обнаружить, что обои были изменены

Мне нужен какой-то способ (дайте, пожалуйста, чёткий кусок кода), чтобы обнаружить, были ли изменены обои рабочего стола без прав администратора...

140
INSERT statement conflicted with FOREIGN KEY

INSERT statement conflicted with FOREIGN KEY

Написал сайт на ASPNET по видеоурокам Гоши Дударя, и столкнулся с ошибкой следующего вида: SqlException: The INSERT statement conflicted with the FOREIGN KEY constraint "FK_OrderDetail_Order_orderId"

196
Программное создание .cs файла

Программное создание .cs файла

У меня есть Windows Forms приложение, там есть разный функционал и одна из функций - запуск написанного кодаДля этого есть несколько кнопок: открыть,...

268
Запись логов в БД

Запись логов в БД

Всем добрый деньХочу настроить логирование сервиса в БД Postgres с помощью ILogger

232