如何删除数组中选定的元素
本文关键字:元素 数组 何删除 删除 | 更新日期: 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#中可以使用的集合。