0

正如标题所暗示的,在 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();
    }
4

2 回答 2

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用于引用类型)。如果不这样做,最终会导致内存泄漏:存储对您认为已删除的内容的引用。它不会影响列表的操作,但可能会导致您使用比预期更多的内存。

于 2013-09-19T23:21:18.653 回答
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术语。

于 2013-09-20T08:49:19.517 回答