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", 50));
badguys.Add( new BadGuy("Magneto", 100));
badguys.Add( new BadGuy("Pip", 5));
badguys.Sort();
foreach(BadGuy guy in badguys)
{
print (guy.name + " " + 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", 50);
BadGuy bg2 = new BadGuy("Magneto", 100);
//可以使用 Add() 方法将变量
//放入字典中。
badguys.Add("gangster", bg1);
badguys.Add("mutant", bg2);
BadGuy magneto = badguys["mutant"];
BadGuy temp = null;
//这是一种访问字典中值的更安全
//但缓慢的方法。
if(badguys.TryGetValue("birds", out temp))
{
//成功!
}
else
{
//失败!
}
}
}