可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
Lets say I have this array,
int[] numbers = {1, 3, 4, 9, 2};
How can I delete an element by \"name\"? , lets say number 4?
Even ArrayList
didn\'t help to delete?
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);
}
回答1:
If you want to remove all instances of 4 without needing to know the 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();
If you want to remove just the first 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: Just in case you hadn\'t already figured it out, as Malfist pointed out, you need to be targetting the .NET Framework 3.5 in order for the LINQ code examples to work. If you\'re targetting 2.0 you need to reference the Non-LINQ examples.
回答2:
int[] numbers = { 1, 3, 4, 9, 2 };
numbers = numbers.Except(new int[]{4}).ToArray();
回答3:
You can also convert your array to a list and call remove on the list. You can then convert back to your array.
int[] numbers = {1, 3, 4, 9, 2};
var numbersList = numbers.ToList();
numbersList.Remove(4);
回答4:
The code that is written in the question has a bug in it
Your arraylist contains strings of \" 1\" \" 3\" \" 4\" \" 9\" and \" 2\" (note the spaces)
So IndexOf(4) will find nothing because 4 is an int, and even \"tostring\" would convert it to of \"4\" and not \" 4\", and nothing will get removed.
An arraylist is the correct way to go to do what you want.
回答5:
Balabaster\'s answer is correct if you want to remove all instances of the element. If you want to remove only the first one, you would do something like this:
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();
}
回答6:
Removing from an array itself is not simple, as you then have to deal with resizing. This is one of the great advantages of using something like a List<int>
instead. It provides Remove
/RemoveAt
in 2.0, and lots of LINQ extensions for 3.0.
If you can, refactor to use a List<>
or similar.
回答7:
I posted my solution here.
This is a way to delete an array element without copying to another array - just in frame of the same array 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);
}
回答8:
As a generic extension, 2.0-compatible:
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);
回答9:
\' To remove items from string based on Dictionary key values.
\' VB.net code
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()
回答10:
You can do in this way:
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();