如何删除数组中选定的元素

本文关键字:元素 数组 何删除 删除 | 更新日期: 2023-09-27 18:13:53

我有这个赋值,我必须从数组中删除一个选定的元素,所以我想出了这个代码:

strInput = Console.ReadLine();
for (int i = 0; i < intAmount; i++)
{
    if (strItems[i] == strInput)
    {
        strItems[i] = null;
        for (int x = 0; x < intAmount-i; x++)
        {
            i = i + 1;
            strItems[i - 1] = strItems[i];
        }
        intAmount = intAmount - 1;
    }
}

问题是,假设我有一个数组[1,2,3,4,5,],我想删除1。输出是[2,3,4,5,5]。当我选择2时也会发生这种情况,但当我选择任何其他数字时都不会发生这种情况。

我做错了什么?

如何删除数组中选定的元素

我假设您正在使用一个基本的字符串数组:

var strItems = new string[] { "1", "2", "3", "4", "5" };

在。net中,数组总是有5个元素长。为了删除一个元素,您必须将剩余的元素复制到一个新数组中并返回它。将某个位置的值设置为null并不会将其从数组中移除。

现在,像LINQ这样的东西很容易(这里没有显示),或者你可以使用List<>集合作弊,这样做:

var list = new List<string>(strItems);
list.Remove("3");
strItems = list.ToArray();

但我不认为这能教会你任何东西。

第一步是找到要删除的元素的索引。你可以使用Array.IndexOf来帮助你。让我们找到中间的元素"3":

int removeIndex = Array.IndexOf(strItems, "3");

如果没有找到元素,它将返回一个-1,所以在做任何操作之前检查一下。

if (removeIndex >= 0)
{
     // continue...
}

最后,您必须将元素(除了索引处我们不想要的元素)复制到一个新数组中。所以,总的来说,你最终会得到这样的东西(注释为解释):

string strInput = Console.ReadLine();
string[] strItems = new string[] { "1", "2", "3", "4", "5" };
int removeIndex = Array.IndexOf(strItems, strInput);
if (removeIndex >= 0)
{
    // declare and define a new array one element shorter than the old array
    string[] newStrItems = new string[strItems.Length - 1];
    // loop from 0 to the length of the new array, with i being the position
    // in the new array, and j being the position in the old array
    for (int i = 0, j = 0; i < newStrItems.Length; i++, j++)
    {
        // if the index equals the one we want to remove, bump
        // j up by one to "skip" the value in the original array
        if (i == removeIndex)
        {
            j++;
        }
        // assign the good element from the original array to the
        // new array at the appropriate position
        newStrItems[i] = strItems[j];
    }
    // overwrite the old array with the new one
    strItems = newStrItems;
}

现在strItems将是新的数组,减去指定的移除值

c#中的数组是固定大小的——一旦初始化,你只能修改项,但是你不能添加或删除项。如果要从集合中删除项,有两个选项:

1)。创建一个新数组,该数组包含原数组的所有成员减去要删除的成员。

2)。使用可调整大小并允许添加或删除List<T>(在您的示例中为List<int>)等项的集合类型。如果您的集合不是静态的,那么您将在"真实世界"中这样做。

在你的具体实现中,我认为你错过了一个break;语句,当你完成内部循环时,你应该从外部循环出去。赋值给null一点用都没有

如果列表只是一个数字列表,为什么要使用字符串?如果是整数,直接使用。

你的练习似乎是这样问的,如果你只需要删除一个元素。

public bool MyDelete(int[] array, int value) // Easy to do for strings too.
{
    bool found = false;
    for (int i = 0; i < array.Length; ++i)
    {
        if (found)
        {
            array[i - 1] = array[i];
        }
        else if (array[i] == value)
        {
            found = true;
        }
    }
    return found;
}

此函数如果找到指定的值将返回true,否则返回false。它会像你在例子中描述的那样移动所有的项,当然,它不会改变数组的大小。

数组是固定大小的。你不能改变数组的大小,因为语言不允许。数组现在、过去和将来都是固定大小的!

要从数组中删除一个元素,你应该这样做:

public static T[] RemoveAt<T>(T[] array, int index) // hope there are not bugs, wrote by scratch.
{
    int count = array.Length - 1;
    T[] result = new T[count];
    if (index > 0)
        Array.Copy(array, 0, result, 0, index - 1);
    if (index < size)
        Array.Copy(array, index + 1, result, index, size - index);
    return result;
}
...
strItems = RemoveAt(strItems, index);

该函数将创建一个新数组,该数组包含除指定索引处的元素外的所有元素。

现在,为什么有人会做这样的事情,而不是使用列表或字典或其他什么?直接使用List而不使用数组

可以使用Except方法筛选数据

AllData = {10, 30, 20, 50}
FilterData = {30, 20}
Result = AllData.Except(​FilterData) 

结果将为{10, 50}

  • 数组是固定大小的,你不能在不创建新数组的情况下缩短它们的长度。你所能做的就是将有效元素的长度存储在数组中。删除1后,长度为4)。

    另外,我不确定数组中元素的顺序是否重要,但如果不是,你可以交换第一个和最后一个元素,而不是将每个元素移动到被移走1位的元素之后。

  • 使用数组的另一种选择是使用集合,如ArrayList,它将负责调整大小,删除和保留其中的项目数量计数,以及更多。

  • 然而,由于这是作业,您可能不得不使用数组。或者使用变量跟踪长度,而不是使用array.length,或者每次想要更改大小时创建一个新数组。如果你不需要使用数组,那么看看c#中可以使用的集合。