简体   繁体   English

C#如何从数组中删除一个元素

[英]How to delete an element from an array in C#

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? ,让我们说数字 4?

Even ArrayList didn't help to delete?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);
}

If you want to remove all instances of 4 without needing to know the index:如果要删除 4 的所有实例而不需要知道索引:

LINQ: (.NET Framework 3.5) LINQ:(. NET 框架 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)非 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) LINQ:(. NET 框架 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)非 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.编辑:以防万一您还没有弄清楚,正如 Malfist 指出的那样,您需要以 .NET Framework 3.5 为目标,以便 LINQ 代码示例工作。 If you're targetting 2.0 you need to reference the Non-LINQ examples.如果您的目标是 2.0,则需要参考非 LINQ 示例。

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

You can also convert your array to a list and call remove on the list.您还可以将数组转换为列表并在列表上调用 remove。 You can then convert back to your array.然后您可以转换回您的数组。

int[] numbers = {1, 3, 4, 9, 2};
var numbersList = numbers.ToList();
numbersList.Remove(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)您的数组列表包含“1”“3”“4”“9”和“2”的字符串(注意空格)

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.所以 IndexOf(4) 什么也找不到,因为 4 是一个整数,甚至“tostring”也会将它转换为“4”而不是“4”,并且不会删除任何内容。

An arraylist is the correct way to go to do what you want. arraylist 是做你想做的事情的正确方法。

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

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.这是使用List<int>类的东西的一大优势。 It provides Remove / RemoveAt in 2.0, and lots of LINQ extensions for 3.0.它在 2.0 中提供Remove / RemoveAt ,以及许多 3.0 的 LINQ 扩展。

If you can, refactor to use a List<> or similar.如果可以,重构为使用List<>或类似的。

Balabaster's answer is correct if you want to remove all instances of the element.如果要删除元素的所有实例,Balabaster 的答案是正确的。 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();
}

As a generic extension, 2.0-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);

' To remove items from string based on Dictionary key values. '根据字典键值从字符串中删除项目。 ' VB.net 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()

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();        
    public int[] DeletePart(int position, params int[] numbers)
    {
        int[] result = new int[numbers.Length - 1];
        int z=0;

        for (int i = 0; i < numbers.Length; i++)
        {
            if (position - 1 != i)
            {
                result[z] = numbers[i];
                z++;
            }
        }
        return result;
    }

We can delete array elements by using for loops and continue statements:我们可以使用for循环和continue语句删除数组元素:

string[] cars = {"volvo", "benz", "ford", "bmw"};
for (int i = 0; i < cars.Length; i++)
{
    if (cars[i] == "benz")
    {
        continue;
    }
    Console.WriteLine(cars[i]);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM