参考
问题引出
希望玩家在Unity的Inspector面板上对一个list赋值,随后,程序将对list中的元素进行操作。操作时,不希望list中的对象重复。(若使用HashSet,则无法序列化,不能让用户在面板上赋值。)
当然,只使用List作为中转,实际操作HashSet中的元素也是可以的。
此外,想要实现List去重,还可以使用一个Dictionary来进行中转,每次加入字典前判断是否已经包含了这个元素即可。
使用Distinct去重
操作方法
- 新建一个类,实现IEqualityComparer接口。注意GetHashCode方法的实现,只有HashCode相同才会去比较。
public class Compare:IEqualityComparer<Student>
{
public bool Equals(Student x,Student y)
{
return x.Id == y.Id;//可以自定义去重规则,此处将Id相同的就作为重复记录,不管学生的爱好是什么
}
public int GetHashCode(Student obj)
{
return obj.Id.GetHashCode();
}
}
- 调用
list = list.Distinct(new Compare()).ToList();
原理
- Enumerable.Distinct 方法:此方法表明,对象可以实现 IEquatable或IEqualityComparer接口来进行去重。