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
的工作原理。从文件中:
如果typeT
实现了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()
方法。这就是列表的工作方式。从文档中删除:
如果typeT
实现了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
都引用不同的对象。