无法通过列表C#从数组中删除元素

时间:2014-01-08 17:36:54

标签: c#

此方法根本不起作用:

    public static void Delete(ref Prot[] pack, Prot prot)
    {
        var temp = new List<Prot>(pack);
        temp.Remove(prot);
        pack = temp.ToArray();
    }

我做错了什么?

谢谢。

1 个答案:

答案 0 :(得分:4)

您的班级Prot需要覆盖Object.Equals()方法。这就是List<T>.Remove的工作原理。来自文档:

  

如果类型T实现IEquatable<T>通用接口,则相等比较器是该接口的Equals方法;否则,默认的相等比较器为Object.Equals

如果不覆盖Object.Equals,它将只使用默认实现来检查引用相等性,而不是值相等。

因此,temp.Remove(prot);永远不会删除任何值。 (这可以根据Remove的返回值进行验证。如果成功删除了值,则返回true,否则返回false

以下是一个基本示例:http://ideone.com/vOZoYI


初步答复(问题是有问题的拼写错误)。

您正在修改新对象List<Prot>,而不是Prot[]参数。如果您将pack分配给List<Prot>.ToArray(),那么它会将其从传入的数组中删除。

public static void Delete(ref Prot[] pack, Prot prot)
{
    var temp = new List<Prot>(pack);
    temp.Remove(prot);
    pack = temp.ToArray();
}