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

C# 无法通过列表C从数组中删除元素#,c#,C#,这种方法根本不起作用: public static void Delete(ref Prot[] pack, Prot prot) { var temp = new List<Prot>(pack); temp.Remove(prot); pack = temp.ToArray(); } 公共静态无效删除(参考保护[]包,保护) { var temp=新列表(包); 温度移除(保护); 组件=阵列温度(); }

这种方法根本不起作用:

    public static void Delete(ref Prot[] pack, Prot prot)
    {
        var temp = new List<Prot>(pack);
        temp.Remove(prot);
        pack = temp.ToArray();
    }
公共静态无效删除(参考保护[]包,保护)
{
var temp=新列表(包);
温度移除(保护);
组件=阵列温度();
}
我做错了什么


谢谢。

您的类
Prot
需要重写
对象.Equals()
方法。这就是
List.Remove
的工作原理。从文件中:

如果type
T
实现了
IEquatable
通用接口,则等式比较器是该接口的Equals方法;否则,默认的相等比较器是
Object.Equals

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

因此,
temp.Remove(保护)从未删除任何值。(这可以根据
Remove
的返回值进行验证。如果成功删除值,则返回
true
,否则返回
false

以下是一个基本示例:


最初的回答(问题是有问题的打字错误)

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

public static void Delete(ref Prot[] pack, Prot prot)
{
    var temp = new List<Prot>(pack);
    temp.Remove(prot);
    pack = temp.ToArray();
}
公共静态无效删除(参考保护[]包,保护)
{
var temp=新列表(包);
温度移除(保护);
组件=阵列温度();
}

您的类
Prot
需要重写
对象.Equals()
方法。这就是
列表的工作方式。从文档中删除

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

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

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

以下是一个基本示例:


最初的回答(问题是有问题的打字错误)

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

public static void Delete(ref Prot[] pack, Prot prot)
{
    var temp = new List<Prot>(pack);
    temp.Remove(prot);
    pack = temp.ToArray();
}
公共静态无效删除(参考保护[]包,保护)
{
var temp=新列表(包);
温度移除(保护);
组件=阵列温度();
}

你想达到什么目的?我假设你想用删除的
prot
项更新
pack
数组?编辑:如果是这样,你忘了将其分配回你的
ref
参数:
pack=temp.ToArray();
你可能会发现这个答案很有用:很抱歉有
pack=temp.ToArray()当然可以。但它无论如何都不起作用。
Prot
是否实现
IEquatable
?是否执行
temp.Remove(Prot)
返回true或false?您想实现什么?我假设您想用删除的
prot
项更新
pack
数组?编辑:如果是这样,您忘记将其分配回
ref
参数:
pack=temp.ToArray()
你可能会发现这个答案很有用:对不起,当然有
pack=temp.ToArray();
但它无论如何都不起作用。
Prot
是否实现
IEquatable
?是否执行
temp.Remove(Prot)
返回true或false?很抱歉,这只是拼错了。它仍然不起作用。这对我来说似乎很奇怪。在该对象中,我只有两个int字段,因此如果它们与其他对象的相同字段相等,则默认情况下,对象是相等的。或者不是?@user3149474否。默认的
Equals
实现是引用相等,即,两边都指同一个对象。
对象a,b;a=new object();b=a;//a.Equals(b)->true
a=new object();b=new object();//a.Equals(b)->false
因为
a
b
都引用不同的对象。很抱歉,这只是拼错了。它仍然不起作用。我觉得很奇怪。在那个对象中,我只有两个int字段,所以如果它们与其他对象的相同字段相等,那么默认情况下对象是相等的。或者不是?@user3149474否。默认值
Equals
实现是引用相等,即双方引用同一对象。
对象a,b;a=new object();b=a;//a.Equals(b)->true
但是
a=new object();b=new object();//a.Equals(b)->false
因为
a
b
都引用不同的对象。