Пожалуйста, приведите пример кода удаления элемента из массива по номеру. Номер удаляемого элемента вводит пользователь

Рейтинг: 0Ответов: 3Опубликовано: 07.04.2015

Есть массив. Пользователь желает удалить элемент массива с определенным номером. Номер удаляемого элемента пользователь вводит самостоятельно. Необходимо удалить этот элемент, а затем вывести на экран измененный массив.

Пожалуйста, приведите пример кода на c#.

Ответы

▲ 6

Массивы в C# имеют фиксированную длину, указываемую при создании, поэтому встроенного метода для удаления нет.

Алгоритм решения во многом зависит от задачи. Простейший способ состоит в преобразовании массива в список, удалении элемента и (при необходимости) обратном преобразовании. обратное преобразование нужно делать в самом конце, после того, как все элементы, требующие удаления, были удалены. В противном случае будут выполняться лишние преобразования туда и обратно.

Выглядит это следующим образом. Пусть a — исходный массив, b — результирующий массив, n — номер удаляемого элемента.

var tmp = new List(a); // Преобразование в список
tmp.RemoveAt(n); // Удаление элемента
var b = tmp.ToArray(); // Преобразование в массив

В этом коде возможна исключительная ситуация, если элемента с номером n нет.

Возможно и более эффективное решение: скопировать элементы до и после удаляемого в новый массив.

var b = new int[a.Length - 1]; // Предположим, что массивы целочисленные
Array.Copy(a, 0, b, 0, n);
Array.Copy(a, n+1, b, n, a.Length - n - 1);

Тут также возможны исключения. Например, если n находится вне диапазона индексов (ArgumentOutOfRangeException).

В первом способе преобразование в список и обратно, а также удаление элемента потребуют троекратного копирования памяти. Второй способ требует лишь одного копирования элементов.

Если вместо List использовать LinkedList, то удаление будет выполняться за константное время, но возникает проблема поиска элемента с номером n.

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

При написании программы нужно отдельно рассмотреть случай, когда в исходном массиве всего один элемент.

Ввод номера осуществляется как обычно. В консоли с помощью Console.ReadLine, в графическом интерфейсе — из нужного компонента. Выводить же массив удобно при помощи метода string.Join. Этот метод объединяет строковые представления элементов при помощи указанного разделителя.

Например, если массив b содержит элементы 1, 2 и 3, то код

Console.WriteLine("b = [{0}]", string.Join(", ", b))

выведет на экран

b = [1, 2, 3]

Справка по Array.Copy

Справка по string.Join

▲ 2

Как правильно заметили в комментариях, из массива элемент не удалить. Его можно либо "занулить", либо сформировать новый массив без указанного элемента.

int[] array = new int[] { 1, 2, 3, 4, 5 };

int index;
if (!int.TryParse(Console.ReadLine(), out index))
{
    Console.WriteLine("Некорректный индекс");
    return;
}

if (index < 0 || index >= array.Length)
{
    Console.WriteLine("Индекс за пределами массива");
    return;
}

// вариант с "занулением" выбранного элемента
array[i] = default(int);

// вариант удаления выбранного элемента с созданием нового массива
int[] newArray = new int[array.Length - 1];
for (int i = 0; i < array.Length; i++)
{
    if (i < index)
    {
        newArray[i] = array[i];
    }
    else if (i > index)
    {
        newArray[i - 1] = array[i];
    }
}
▲ 2

в Шарпе нету возможности изменения размера массива, откуда следует что так или иначе вам придется создать новый массив если размер имеет значения :)

Я бы использвал List<T>, но если все таки массив по той или иной причине невозможно менять то можно использвать примерно такой алгоритм

var nArray = new int[oArray.Length - 1];
var cIndex = 0;

for(int i = 0; i < removeIndex; i++)
{
   nArray[i] = oArray[i];
}

for(int i = removeIndex + 1; i < nArray.Length; i++)
{
   nArray[i] = oArray[i];
}