How to delete an element from an array in C#

C#.NetArrays

C# Problem Overview


Lets say I have this array,

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

How can I delete an element by "name"? , lets say number 4?

Even ArrayList didn't help to delete?

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

C# Solutions


Solution 1 - C#

If you want to remove all instances of 4 without needing to know the index:

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

If you want to remove just the first instance:

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: Just in case you hadn't already figured it out, as Malfist pointed out, you need to be targetting the .NET Framework 3.5 in order for the LINQ code examples to work. If you're targetting 2.0 you need to reference the Non-LINQ examples.

Solution 2 - C#

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

Solution 3 - C#

You can also convert your array to a list and call remove on the list. You can then convert back to your array.

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

Solution 4 - C#

The code that is written in the question has a bug in it

Your arraylist contains strings of " 1" " 3" " 4" " 9" and " 2" (note the spaces)

So IndexOf(4) will find nothing because 4 is an int, and even "tostring" would convert it to of "4" and not " 4", and nothing will get removed.

An arraylist is the correct way to go to do what you want.

Solution 5 - C#

I posted my solution here.

This is a way to delete an array element without copying to another array - just in frame of the same array instance:

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

Solution 6 - C#

Removing from an array itself is not simple, as you then have to deal with resizing. This is one of the great advantages of using something like a List<int> instead. It provides Remove/RemoveAt in 2.0, and lots of LINQ extensions for 3.0.

If you can, refactor to use a List<> or similar.

Solution 7 - C#

Balabaster's answer is correct if you want to remove all instances of the element. If you want to remove only the first one, you would do something like this:

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

Solution 8 - C#

As a generic extension, 2.0-compatible:

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

Usage:

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

Solution 9 - C#

You can do in this way:

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

Solution 10 - C#

' To remove items from string based on Dictionary key values. ' VB.net code

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

Solution 11 - C#

    public int[] DeletePart(int position, params int[] numbers)
    {
        int[] result = new int[numbers.Length - 1];
        int z=0;

        for (int i = 0; i < numbers.Length; i++)
        {
            if (position - 1 != i)
            {
                result[z] = numbers[i];
                z++;
            }
        }
        return result;
    }

Solution 12 - C#

We can delete array elements by using for loops and continue statements:

string[] cars = {"volvo", "benz", "ford", "bmw"};
for (int i = 0; i < cars.Length; i++)
{
    if (cars[i] == "benz")
    {
        continue;
    }
    Console.WriteLine(cars[i]);
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionahmedView Question on Stackoverflow
Solution 1 - C#BenAlabasterView Answer on Stackoverflow
Solution 2 - C#meetjaydeepView Answer on Stackoverflow
Solution 3 - C#Dave DPView Answer on Stackoverflow
Solution 4 - C#DevinBView Answer on Stackoverflow
Solution 5 - C#infografnetView Answer on Stackoverflow
Solution 6 - C#ctackeView Answer on Stackoverflow
Solution 7 - C#Vojislav StojkovicView Answer on Stackoverflow
Solution 8 - C#PetrucioView Answer on Stackoverflow
Solution 9 - C#user4860969View Answer on Stackoverflow
Solution 10 - C#SP007View Answer on Stackoverflow
Solution 11 - C#Varun KumarView Answer on Stackoverflow
Solution 12 - C#arman arameshView Answer on Stackoverflow