当前位置: 首页 > article >正文

Unity面向对象补全计划 之 List<T>与class(非基础)

C# & Unity 面向对象补全计划 泛型-CSDN博客

关于List,其本质就是C#封装好的一个数组,是一个很好用的轮子,所以并不需要什么特别说明

问题描述

假设我们有一个表示学生的类 Student,每个学生有姓名和年龄两个属性。我们需要创建一个学生列表,并实现以下功能:

  1. 添加学生到列表中
  2. 打印所有学生的信息(需要重写Tostring)
  3. 查找特定姓名的学生并打印其信息

 解决思路

用一个List来保存每一个学生的信息

        1.用List.Add方法添加学生

        2.用foreachi遍历打印

        3.用Find查找

数据图解

也就是说list<student> s

其中s[n]代表了一个个的student对象,而s[n].name,s[n].age才是我们要的数据,莫要搞混了

 

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

public class Student : MonoBehaviour
{
    public string Name { get; set; }
    public int Age { get; set; }

    public Student(string name, int age)
    {
        Name = name;
        Age = age;
    }

    public override string ToString()
    {
        return $"Name: {Name}, Age: {Age}";
    }
}

管理类一览 

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

public class StudentManager : MonoBehaviour
{
    List<Student> ss;
    private void Awake()
    {
        ss = new List<Student>();

        //添加
        ss.Add(new Student("张三",10));
        ss.Add(new Student("李四", 15));
        //遍历
        foreach (Student temp in ss)
        {
            Debug.Log(temp);
        }
        //查找
        string tempName1 = "张三";
        
        //注意下面这行我声明了一个临时的对象存储需要找到对象
        //Find可以传入函数所以我就使用了一个lambda表达式
        Student foundStudent1 = ss.Find((value)=>value.Name == tempName1);

        //其等价于
        //students.Find(delegate (Student s) {
        //    return s.Name == tempName1;
        //});

        if (foundStudent1 != null)        {

            Debug.Log($"已找到该学生{foundStudent1}");
        }
        else
        {
            Debug.Log($"未找到该学生{tempName1}");
        }
    }
}

注意事项:

添加和遍历并不难,查找需要特别说明一点,这里我用的Find甚至直接传入的lambda表达式

因为思路如下:

为什么不用Contains对比呢? 

Contains 方法依赖于 Equals 方法和 GetHashCode 方法来判断列表中是否包含某个对象,如果非要用Contains 来写的话,就需要像下面这样重写这两个函数

    public override bool Equals(object obj)
    {
        if (obj == null || GetType() != obj.GetType())
            return false;

        Student other = (Student)obj;
        return Name == other.Name && Age == other.Age;
    }

    public override int GetHashCode()
    {
        return HashCode.Combine(Name, Age);
    }

使用的时候则需要创建一个临时变量,传入要查找的值,还需要实例化一下所以不是太方便了

Student tempName1= new Student("Bob", 22);

http://www.kler.cn/a/289455.html

相关文章:

  • Camera Tuning中AE/AWB/AF基础知识介绍
  • 小程序中引入下载到本地的iconfont字体图标加载不出来问题解决
  • docker compose 多个 Dockerfile
  • aws xray通过设置采样规则对请求进行过滤
  • 【SpringBoot】18 上传文件到数据库(Thymeleaf + MySQL)
  • 【C++类型转换和IO流】
  • CMake构建学习笔记12-libzip库的构建
  • ArkUI-状态管理-@Provide、@Consume、@Observed、@ObjectLink
  • 9\1 numpy基础(二)
  • vue2表格显隐列的封装【升级缓存版】
  • 文件包含漏洞PHP伪协议利用方法
  • Kaggle竞赛:Rossmann Store Sales第66名策略复现
  • Java后端面试题(微服务相关)(day12)
  • GPU环境配置:1.CUDA、Anaconda、Pytorch
  • 在Linux中使用MySQL基础SQL语句及校验规则
  • 振动分析-23-频域分析之深入理解幅值谱与相位谱的计算过程
  • 【ssh】如何远程连接
  • 小米电视使用adb 卸载自带应用教程
  • 每日刷题(图论)
  • 基于Android Studio的用户行程记录APK开发指南(一):项目基础配置与速通Kotlin
  • unreal engine骨骼绑定重定向实现自定义人物替换游戏中小白人,但是用小白人或者某超人现有的移动等功能再次折腾笔记...
  • 电脑连接公司服务器记住了账户密码,怎么换账户呢?
  • python实战三-提取Word数据到Excel
  • 《python语言程序设计》第8章第12题生物信息:找出基因,生物学家使用字母A C T和G构成字符2串建模一个基因组(下)
  • 【Linux系统编程】TCP实现--socket
  • 力扣2542.最大子序列的分数