web-dev-qa-db-fra.com

Comment supprimer un élément d'un tableau en C #

Disons que j'ai ce tableau,

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

Comment puis-je supprimer un élément par "nom"? , disons le numéro 4?

Même ArrayList n'a pas aidé à supprimer?

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

Si vous souhaitez supprimer toutes les instances de 4 sans avoir besoin de connaître l'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();

Si vous souhaitez supprimer uniquement la première 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:Au cas où vous ne l'auriez pas déjà compris, comme le souligne Malfist, vous devez cibler le .NET Framework 3.5 pour que les exemples de code LINQ fonctionnent. Si vous ciblez 2.0, vous devez faire référence aux exemples non-LINQ.

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

Vous pouvez également convertir votre tableau en liste et appeler remove sur la liste. Vous pouvez ensuite reconvertir votre tableau.

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

Le code écrit dans la question contient un bogue.

Votre liste contient des chaînes de caractères "1" "3" "4" "9" et "2" (notez les espaces)

Donc IndexOf (4) ne trouvera rien car 4 est un int, et même "tostring" le convertirait en "4" et non "4", et rien ne sera supprimé.

Un arraylist est la bonne façon de faire ce que vous voulez.

10
DevinB

La suppression d'un tableau en soi n'est pas simple, car vous devez alors gérer le redimensionnement. C’est l’un des grands avantages d’utiliser quelque chose comme un List<int> à la place. Il fournit Remove/RemoveAt en 2.0 et de nombreuses extensions LINQ pour 3.0. 

Si vous le pouvez, refactoriser pour utiliser un List<> ou similaire.

5
ctacke

La réponse de Balabaster est correcte si vous souhaitez supprimer toutes les instances de l'élément. Si vous souhaitez supprimer uniquement le premier, procédez comme suit:

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

J'ai posté ma solution ici .

C'est un moyen de supprimer un élément de tableau sans le copier dans un autre tableau, juste dans le cadre de la même 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);
    }
4
infografnet

En tant qu'extension générique, compatible 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();
    }
}

Usage:

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

Vous pouvez faire de cette façon:

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

' Pour supprimer des éléments de la chaîne en fonction des valeurs de clé de dictionnaire. ' Code 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