C# List<T> 集合查找、删除内容相同的引用类型元素

List 集合查找、删除内容相同的引用类型元素

请添加图片描述

🍣通常情况

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{
    internal class People
    {
        public string name;
        public People(string name) {
            this.name = name;
        }
    }
    // Start is called before the first frame update
    void Start()
    {
        List<People> list = new List<People>();

        var t1 = new People("张三");
        var t2 = new People("张三");

        list.Add(t1);

        bool isContain = list.Contains(t2);
        bool isRemoved = list.Remove(t2);
        
        Debug.Log(isContain); // false
        Debug.Log(isRemoved); // false
    }

}


如上所示,因为People类没有实现IEquatable接口,调用集合Contains、Remove方法时使用Object类的Equals() 方法比较这些元素,默认实现代码对值类型按位比较,对引用类型只比较其引用(内存地址),t1和t2是两个不同引用对象,所以无法用t2查询或删除集合中的t1。

🌮重写IEquatable接口

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{
    internal class People:IEquatable<People>
    {
        public string name;
        public People(string name) {
            this.name = name;
        }

        public bool Equals(People other)
        {
            return name.Equals(other.name);
        }
    }
    // Start is called before the first frame update
    void Start()
    {
        List<People> list = new List<People>();

        var t1 = new People("张三");
        var t2 = new People("张三");

        list.Add(t1);

        bool isContain = list.Contains(t2);
        bool isRemoved = list.Remove(t2);

        Debug.Log(isContain); // true
        Debug.Log(isRemoved); // true
    }

}

如上所示,在People类实现了IEquatable接口并重写Equals方法, t1和t2具有相同name,因此可以用t2成功查询并删除掉集合中的t1。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牙膏上的小苏打2333

哟,哟,切克闹,煎饼果子来一套

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值