在什么情况下,System.Collections.Generic.List中的项目不能成功删除?

时间:2011-05-20 10:10:11

标签: c# .net vb.net list generic-list

在什么情况下System.Collections.Generic.List中的项目不能成功删除?

来自http://msdn.microsoft.com/en-us/library/cd666k3e.aspx

  

如果项目已成功删除,则为true;   否则,错误。这种方法也   如果找不到项,则返回false   清单(Of T)。

他们说出来的方式让我觉得对List(Of T)中找到的项目的删除操作可能实际上失败了,因此这个问题。

4 个答案:

答案 0 :(得分:5)

查看Reflector中的System.Collections.Generic.List源代码,看起来集合中找不到的项目确实是Remove返回false的唯一方法。

int index = this.IndexOf(item);
if (index >= 0)
{
    this.RemoveAt(index);
    return true;
}
return false;

答案 1 :(得分:4)

是的,如果您尝试删除不在列表中的项目,它可以被归类为失败并返回false以显示没有删除任何内容。

如果您希望在实际删除某些内容时执行其他代码,则此功能非常有用。

更新:如果你的类实现IEquality并抛出异常,代码就会抛出,因为它没有机会返回。

与其他发布反映来源的人一起,只有在找不到项目时才返回false。

更新:进一步向其他人的来源。如果你看一下IndexOf方法链,你就会发现它归结为平等并没有什么特别的。

List.Remove:

public bool Remove(T item)
{
    int num = this.IndexOf(item);
    if (num >= 0)
    {
        this.RemoveAt(num);
        return true;
    }
    return false;
}

List.IndexOf:

public int IndexOf(T item)
{
    return Array.IndexOf<T>(this._items, item, 0, this._size);
}

Array.IndexOf:

public static int IndexOf<T>(T[] array, T value, int startIndex, int count)
{
    if (array == null)
    {
        throw new ArgumentNullException("array");
    }
    if (startIndex < 0 || startIndex > array.Length)
    {
        throw new ArgumentOutOfRangeException("startIndex", Environment.GetResourceString("ArgumentOutOfRange_Index"));
    }
    if (count < 0 || count > array.Length - startIndex)
    {
        throw new ArgumentOutOfRangeException("count", Environment.GetResourceString("ArgumentOutOfRange_Count"));
    }
    return EqualityComparer<T>.Default.IndexOf(array, value, startIndex, count);
}

EqualityComparer.IndexOf:

internal virtual int IndexOf(T[] array, T value, int startIndex, int count)
{
    int num = startIndex + count;
    for (int i = startIndex; i < num; i++)
    {
        if (this.Equals(array[i], value))
        {
            return i;
        }
    }
    return -1;
}

来自ILSpy的所有代码,不,谢谢Red Gate: - )

答案 2 :(得分:4)

[TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
public bool Remove(T item)
{
    int index = this.IndexOf(item);
    if (index >= 0)
    {
        this.RemoveAt(index);
        return true;
    }
    return false;
}

以上代码通过反射器。如果它不在集合中,则不会被删除。我猜测文档/语言不一致。

答案 3 :(得分:2)

在Mono的源代码中进行比较:

https://github.com/mono/mono/raw/master/mcs/class/corlib/System.Collections.Generic/List.cs

public bool Remove (T item)
{
    int loc = IndexOf (item);
    if (loc != -1)
        RemoveAt (loc);

    return loc != -1;
}

因此,文档过于模糊