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



допустим, у меня есть этот массив,



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);
}
16942   10  

10 ответов:

если вы хотите удалить все экземпляры 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();

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

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

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

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

код, который написан в вопросе ошибка

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

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

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

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

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();
}

я опубликовал свое решение здесь.

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

    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's decrement Array's size by one
        Array.Resize(ref arr, arr.Length - 1);
    }

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

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

как общее расширение, 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);

'для удаления элементов из строки на основе значений ключей словаря. '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()

вы можете сделать так:

int[] numbers= {1,3,4,9,2};     
List<int> lst_numbers = new List<int>(numbers);
int required_number = 4;
int i = 0;
foreach (int number in lst_numbers)
{              
    if(number == required_number)
    {
        break;
    }
    i++;
}
lst_numbers.RemoveAt(i);
numbers = lst_numbers.ToArray();        

Comments

    Ничего не найдено.