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

C# 如何删除数组中的选定元素?,c#,arrays,C#,Arrays,我有一个任务,我必须从数组中删除一个选定的元素,所以我产生了以下代码: 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 =

我有一个任务,我必须从数组中删除一个选定的元素,所以我产生了以下代码:

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;
    }
}
strInput=Console.ReadLine();
对于(inti=0;i
问题是,假设我有一个数组
[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这样的东西非常容易(这里没有显示),或者你可以使用
列表
集合进行欺骗,然后执行以下操作:

var list = new List<string>(strItems);
list.Remove("3");
strItems = list.ToArray();
如果找不到元素,它将返回-1,因此在执行任何操作之前请检查该值

if (removeIndex >= 0)
{
     // continue...
}
最后,您必须将元素(除了我们不想要的索引处的元素)复制到一个新数组中。因此,总的来说,你最终会得到这样的结果(评论以供解释):

strInput=Console.ReadLine();
字符串[]strItems=新字符串[]{“1”、“2”、“3”、“4”、“5”};
int removeIndex=Array.IndexOf(strItems,strInput);
如果(removeIndex>=0)
{
//声明并定义一个比旧数组短一个元素的新数组
string[]newStrItems=新字符串[strItems.Length-1];
//从0循环到新数组的长度,i为位置
//在新数组中,j是旧数组中的位置
for(inti=0,j=0;i
现在,strItems将是新数组,减去指定要删除的值。

  • 数组是固定大小的,如果不创建新数组,则无法缩短其长度。您所能做的就是在数组中存储有效元素的长度(即,删除
    1
    后,长度为4)

    此外,我不确定数组中元素的顺序是否重要,但如果不重要,则可以交换第一个和最后一个元素,而不是将移除的元素后的每个元素向前移动1个位置

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

  • 但是,由于这是家庭作业,您可能必须使用数组。使用变量跟踪长度,而不是使用
    array.length
    ,或者每次要更改大小时都创建一个新数组。如果您不必使用数组,那么请查看可以在C#中使用的集合

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

1.)创建一个新数组,其中包含原始数组的所有成员减去要删除的成员


2.)使用可调整大小并允许添加或删除项目的集合类型,如
List
List
)。如果你的收藏不是静态的,这就是你在“现实世界”中会做的事。

在你的具体实现中,我认为你错过了一个突破语句,当完成内部循环时,应该从外部循环退出。赋值为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;
}
public bool MyDelete(int[]数组,int-value)//字符串也很容易处理。
{
bool-found=false;
for(int i=0;i
如果找到指定的falue,此函数将返回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);
publicstatict[]RemoveAt(T[]array,int-index)//希望没有bug,由scratch编写。
{
int count=array.Length-1;
T[]结果=新的T[计数];
如果(索引>0)
复制(数组,0,结果,0,索引-1);
如果(索引<大小)
复制(数组,索引+1,结果,索引,大小-索引);
返回结果;
}
...
strItems=移除(strItems,索引);
此函数将创建一个新数组,该数组包含除指定索引处的元素外的所有元素

现在,为什么有人会这样做,而不是使用列表、字典或wathever?
直接使用列表而不使用数组。

可以使用Exception方法筛选数据

AllData = {10, 30, 20, 50}

FilterData = {30, 20}

Result = AllData.Except(​FilterData) 
结果将是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);
AllData = {10, 30, 20, 50}

FilterData = {30, 20}

Result = AllData.Except(​FilterData)