如何从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()
- 如何将列表绑定到dataGridView?
- 集成到Windows资源pipe理器上下文菜单中
- 在“foreach”循环中修改列表的最好方法是什么?
- Exception.Message vs Exception.ToString()
- 我得到无法加载资源:net :: ERR_BLOCKED_BY_CLIENT与谷歌浏览器
- 我怎样才能让一个DateTimePicker显示一个空string?
- 编译dynamicexpression式所需的一个或多个types无法find。 您是否缺less对Microsoft.CSharp.dll和System.Core.dll的引用?
- locking模式以正确使用.NET MemoryCache
- 哪个unit testing框架?