正如标题所示,在C#中我试图改变这个删除方法以获取数组中的最后一项并移动它来代替已删除的值。这样,当您删除元素时,它不必采用每个单独的数字并将其向上移动。
这是我目前的代码:
public override void remove(ref T item)
{
if (next == 0)
{
}
else
{
//find value, if it exists
for (int i = 0; i < next; i++)
{
if (item.Equals(list[i]))
{
for (int j = i; j < next; j++) list[j] = list[j + 1];
next--;
break;
}
}
}
}
任何帮助都将不胜感激。
这是我将值插入数组的代码。
{
UnorderedArrayList<int> u = new UnorderedArrayList<int>();
u.print();
int var = 5;
u.insert(ref var);
var = 12;
u.insert(ref var);
var = 2;
u.insert(ref var);
var = 29;
u.insert(ref var);
u.print();
var = 5;
u.remove(ref var);
u.print();
}
答案 0 :(得分:1)
你所要做的就是用移动最后一项的代码替换你的内循环,然后清除最后一项:
public override void remove(ref T item)
{
// find value, if it exists
for (int i = 0; i < next; i++)
{
if (item.Equals(list[i]))
{
list[i] = list[next-1];
list[next-1] = default(T);
next--;
break;
}
}
}
开头没有必要检查next == 0
,因为for
条件会检查它。如果next == 0
,则循环不会进行任何迭代。
找到项目时,代码只移动最后一项以替换找到的索引处的项目。然后,它将最后一项设置为default(T)
(参考类型将为null
)。如果不这样做,最终会导致内存泄漏:存储对您认为已删除的内容的引用。它不会影响列表的操作,但可能会导致您使用比预期更多的内存。
答案 1 :(得分:0)
对于一些LINQy善良:
public static IEnumerable<T> ShuffleRemove<T>(this IEnumerable<T> enumerable, T item)
{
var count = enumerable.Count();
var last = enumerable.ElementAt(count - 1);
var found = false;
for (int i = 0; i < count - 1; i++)
{
var current = enumerable.ElementAt(i);
if (!found && item.Equals(current))
{
yield return last;
found = true;
}
else
{
yield return current;
}
}
yield break;
}
用法:
var array = new int[] { 1, 2, 2, 3, 4, 5 };
array.ShuffleRemove(2); // returns: 1, 5, 2, 3, 4
如果您需要将所有二人替换为5,请删除所有found
条款。