it-roy-ru.com

Как удалить элемент из массива в 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);
}
126
ahmed

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

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

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

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

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

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

Поэтому IndexOf (4) ничего не найдет, потому что 4 является целым числом, и даже «tostring» преобразует его в «4», а не «4», и ничего не будет удалено.

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

10
DevinB

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

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

5
ctacke

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

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

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

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

    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);
    }
4
infografnet

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

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

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();        
0
Manish Jain

' Удалить элементы из строки на основе значений словаря. Код 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()
0
SP007