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);
}
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.
int[] numbers = { 1, 3, 4, 9, 2 };
numbers = numbers.Except(new int[]{4}).ToArray();
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);
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.
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.
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();
}
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);
}
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);
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();
' 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()