如何从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); } 

如果你想删除所有4的实例而不需要知道索引:

LINQ:(. NET Framework 3.5)

 int[] numbers = { 1, 3, 4, 9, 2 }; int numToRemove = 4; numbers = numbers.Where(val => val != numToRemove).ToArray(); 

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

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

编辑:如果你还没有弄明白,就像Malfist指出的那样,为了使LINQ代码示例能够工作,你需要定位到.NET Framework 3.5。 如果你的目标是2.0,你需要引用非LINQ的例子。

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

您也可以将您的数组转换为列表并调用列表中的删除。 然后你可以转换回你的数组。

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

写在问题中的代码有一个bug

您的数组列表包含“1”“3”“4”“9”和“2”(注意空格)

所以IndexOf(4)将找不到任何东西,因为4是一个int,甚至“tostring”将它转换为“4”而不是“4”,并且什么都不会被删除。

数组列表是正确的方式去做你想做的事情。

如果你想删除元素的所有实例,Balabaster的答案是正确的。 如果你只想删除第一个,你可以这样做:

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

从数组中移除并不是一件简单的事情,因为你必须处理大小调整。 这是使用类似List<int>优点之一。 它提供2.0中的Remove / RemoveAt ,以及3.0中的大量LINQ扩展。

如果可以的话,重构使用List<>或类似的。

我在这里发布我的解决scheme

这是一种删除数组元素而不复制到另一个数组的方法 – 只是在同一个数组实例的框架中:

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

作为一个通用的扩展,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); 

' 根据字典键值从string中删除项目。 '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()