187 votes

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

0 votes

Que faire si vous avez des valeurs en double dans votre liste ? Voulez-vous seulement supprimer la première instance ou toutes les instances ?

0 votes

oui, je n'ai pas de valeurs en double, une idée ?

0 votes

ahmed Vous voulez dire, non vous ne le faites pas, ou oui vous le faites ? (je n'insulte pas votre anglais, je demande juste une clarification)

394voto

BenAlabaster Points 20189

Si vous voulez 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 voulez supprimer seulement 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 Malfist l'a souligné, vous devez cibler le .NET Framework 3.5 pour que les exemples de code LINQ fonctionnent. Si vous ciblez la version 2.0, vous devez vous référer aux exemples Non-LINQ.

41voto

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

27voto

Dai Points 86

Vous pouvez également convertir votre tableau en une 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);

0 votes

NumbersList.Remove(4) ; doit être : numbersList.RemoveAt(4) ;

1 votes

@Deniz *Voix de Yoda* Regarde de plus près, mon ami. Pour le tableau, il y a plus que ce que vous voyez. Les deux sont valides, numbersList.Remove(4) y numbersList.RemoveAt(4) ! Mais le même résultat, ils ne donnent pas.

12voto

DevinB Points 5960

Le code qui est écrit dans la question a un bug.

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

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

Une liste de tableaux est la bonne solution pour faire ce que vous voulez.

1 votes

List<T> serait mieux que ArrayList.

1 votes

Cette réponse mérite plus de votes positifs. Bien que je sois absolument d'accord avec @MikeScott que List<T> serait mieux que ArrayList, cela semble être la seule réponse qui identifie correctement le problème que le PO avait quand il a essayé d'utiliser ArrayList pour résoudre son problème original. Le PO a compris qu'on ne peut pas redimensionner les tableaux, ce que personne d'autre ne semble avoir remarqué, et a essayé d'utiliser un type redimensionnable à la place, ce que personne d'autre ne semble avoir remarqué, et s'est ensuite fait piéger par un autre problème, que personne d'autre ne semble avoir remarqué.

6voto

Vojislav Stojkovic Points 4764

La réponse de Balabaster est correcte si vous voulez supprimer toutes les instances de l'élément. Si vous ne voulez supprimer que la première, vous devez faire quelque chose comme ceci :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X