Как удалить элемент из массива в С#

Предположим, что у меня есть этот массив,

int[] numbers = {1, 3, 4, 9, 2};

Как удалить элемент по имени?, скажем, номер 4?

Даже ArrayList не удалось удалить?

string strNumbers = " 1, 3, 4, 9, 2";
ArrayList numbers = new ArrayList(strNumbers.Split(new char[] { ',' }));
numbers.RemoveAt(numbers.IndexOf(4));
foreach (var n in numbers)
{
    Response.Write(n);
}

Ответ 1

Если вы хотите удалить все экземпляры 4 без необходимости знать индекс:

LINQ: (.NET Framework 3.5)

int[] numbers = { 1, 3, 4, 9, 2 };
int numToRemove = 4;
numbers = numbers.Where(val => val != numToRemove).ToArray();

Non-LINQ: (.NET Framework 2.0)

static bool isNotFour(int n)
{
    return n != 4;
}

int[] numbers = { 1, 3, 4, 9, 2 };
numbers = Array.FindAll(numbers, isNotFour).ToArray();

Если вы хотите удалить только первый экземпляр:

LINQ: (.NET Framework 3.5)

int[] numbers = { 1, 3, 4, 9, 2, 4 };
int numToRemove = 4;
int numIndex = Array.IndexOf(numbers, numToRemove);
numbers = numbers.Where((val, idx) => idx != numIndex).ToArray();

Non-LINQ: (.NET Framework 2.0)

int[] numbers = { 1, 3, 4, 9, 2, 4 };
int numToRemove = 4;
int numIdx = Array.IndexOf(numbers, numToRemove);
List<int> tmp = new List<int>(numbers);
tmp.RemoveAt(numIdx);
numbers = tmp.ToArray();

Изменить: На всякий случай, если вы еще не поняли это, как указал Малфист, вам нужно настроить .NET Framework 3.5, чтобы примеры кода LINQ работали. Если вы настроите 2.0, вам нужно ссылаться на примеры, не связанные с LINQ.

Ответ 2

int[] numbers = { 1, 3, 4, 9, 2 };
numbers = numbers.Except(new int[]{4}).ToArray();

Ответ 3

Вы также можете преобразовать свой массив в список и удалить вызов из списка. Затем вы можете преобразовать обратно в свой массив.

int[] numbers = {1, 3, 4, 9, 2};
var numbersList = numbers.ToList();
numbersList.Remove(4);

Ответ 4

В коде, написанном в вопросе, есть ошибка в нем

Ваш arraylist содержит строки "1" "3" "4" "9" и "2" (обратите внимание на пробелы)

Так что IndexOf (4) ничего не найдет, потому что 4 - это int, и даже "tostring" преобразует его в "4" , а не "4" , и ничего не будет удалено.

Аррайалист - это правильный способ сделать то, что вы хотите.

Ответ 5

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

int[] numbers = { 1, 3, 4, 9, 2, 4 };
int numToRemove = 4;
int firstFoundIndex = Array.IndexOf(numbers, numToRemove);
if (numbers >= 0)
{
    numbers = numbers.Take(firstFoundIndex).Concat(numbers.Skip(firstFoundIndex + 1)).ToArray();
}

Ответ 6

Удаление из массива не просто, так как вам приходится иметь дело с изменением размера. Это одно из больших преимуществ использования вместо этого List<int>. Он обеспечивает Remove/RemoveAt в 2.0 и множество расширений LINQ для 3.0.

Если вы можете, рефакторинг использовать List<> или аналогичный.

Ответ 7

Я разместил свое решение здесь.

Это способ удаления элемента массива без копирования в другой массив - только в рамках одного экземпляра массива:

    public static void RemoveAt<T>(ref T[] arr, int index)
    {
        for (int a = index; a < arr.Length - 1; a++)
        {
            // moving elements downwards, to fill the gap at [index]
            arr[a] = arr[a + 1];
        }
        // finally, let decrement Array size by one
        Array.Resize(ref arr, arr.Length - 1);
    }

Ответ 8

Как общее расширение, 2.0-совместимое:

using System.Collections.Generic;
public static class Extensions {
    //=========================================================================
    // Removes all instances of [itemToRemove] from array [original]
    // Returns the new array, without modifying [original] directly
    // .Net2.0-compatible
    public static T[] RemoveFromArray<T> (this T[] original, T itemToRemove) {  
        int numIdx = System.Array.IndexOf(original, itemToRemove);
        if (numIdx == -1) return original;
        List<T> tmp = new List<T>(original);
        tmp.RemoveAt(numIdx);
        return tmp.ToArray();
    }
}

Использование:

int[] numbers = {1, 3, 4, 9, 2};
numbers = numbers.RemoveFromArray(4);

Ответ 9

' Чтобы удалить элементы из строки на основе значений словаря. 'Код VB.net

 Dim stringArr As String() = "file1,file2,file3,file4,file5,file6".Split(","c)
 Dim test As Dictionary(Of String, String) = New Dictionary(Of String, String)
 test.Add("file3", "description")
 test.Add("file5", "description")
 stringArr = stringArr.Except(test.Keys).ToArray()