【Unity学习笔记】Lists and Dictionaries
菜肉四喜丸子
2020年12月29日 19:53
收录于文集
共94篇

1. 列表和字典的定义

二者的工作原理类似于数组,但有一些明显区别。列表就像是大小动态变化的数组,这表示你不需要提前知道列表将包括多少个元素。

我们首先创建一个可以存储在列表中的类。列表是泛型类,因此可以存储任意类型。创建列表时,首先要添加System.Collections.Generic命名空间。接下来我们声明列表。list是泛型类,因此在任何修饰符之后我们输入类名,后跟要存储在列表中的类型,然后为列表指定名称。由于列表是一个类,因此我们调用构造函数。现在列表是空的,我们用Add函数为其添加内容,这将在列表末尾添加新元素。Add函数的参数是要添加到列表的对象。要访问列表项,可以像数组一样使用索引进行访问。列表最强大的函数之一是Sort,可用于按给定类型的任何变量对这个类型的列表进行排序。它依赖类型来实现IComparable接口。

字典的工作原理与列表类似,但它有两种类型。这表示每个元素组成一个键值对(KVP),字典的预期用途也与列表不同。列表通常用于替代需要更多灵活性或功能的数组。字典用作可通过一个或多个键访问的值的集合。声明字典的过程与列表非常相似,首先添加System.Collections.Generic名称空间,然后像之前一样声明变量,但具有两个泛型类型。第一个类型是键,这是为了访问第二个类型而引用的类型。第二个类型是值。访问与键相关的值非常类似于访问数组或列表的元素。但是,我们不使用索引。索引对字典没有内在含义。

2. 脚本示例

BadGuy

using UnityEngine;

using System.Collections;

using System; //这允许 IComparable 接口

 

//这是您将存储在

//不同集合中的类。为了使用

//集合的 Sort() 方法,此类需要

//实现 IComparable 接口。

public class BadGuy : IComparable<BadGuy>

{

    public string name;

    public int power;

 

    public BadGuy(string newName, int newPower)

    {

        name = newName;

        power = newPower;

    }

 

    //IComparable 接口需要

    //此方法。

    public int CompareTo(BadGuy other)

    {

        if(other == null)

        {

            return 1;

        }

 

        //返回力量差异。

        return power - other.power;

    }

}

SomeClass

using UnityEngine;

using System.Collections;

using System.Collections.Generic;

 

public class SomeClass : MonoBehaviour

{

    void Start ()

    {

        //这是创建列表的方式。注意如何在

        //尖括号 (< >) 中指定类型。

        List<BadGuy> badguys = new List<BadGuy>();

 

        //这里将 3 个 BadGuy 添加到列表

        badguys.Add( new BadGuy("Harvey&#​34;, 50));

        badguys.Add( new BadGuy("Magneto&#​34;, 100));

        badguys.Add( new BadGuy("Pip&#​34;, 5));

 

        badguys.Sort();

 

        foreach(BadGuy guy in badguys)

        {

            print (guy.name + " &#​34; + guy.power);

        }

 

        //这会清除列表,使其

        //为空。

        badguys.Clear();

    }

}

SomeOtherClass

using UnityEngine;

using System.Collections;

using System.Collections.Generic;

 

public class SomeOtherClass : MonoBehaviour

{

    void Start ()

    {

        //这是创建字典的方式。注意这是如何采用

        //两个通用术语的。在此情况中,您将使用字符串和

        //BadGuy 作为两个值。

        Dictionary<string, BadGuy> badguys = new Dictionary<string, BadGuy>();

 

        BadGuy bg1 = new BadGuy("Harvey&#​34;, 50);

        BadGuy bg2 = new BadGuy("Magneto&#​34;, 100);

 

        //可以使用 Add() 方法将变量

        //放入字典中。

        badguys.Add("gangster&#​34;, bg1);

        badguys.Add("mutant&#​34;, bg2);

 

        BadGuy magneto = badguys["mutant&#​34;];

 

        BadGuy temp = null;

 

        //这是一种访问字典中值的更安全

        //但缓慢的方法。

        if(badguys.TryGetValue("birds&#​34;, out temp))

        {

            //成功!

        }

        else

        {

            //失败!

        }

    }

}