最近刚接手了新的新项目,发现项目中使用了大量的foreach循环遍历字典,在使用unity的时候,要尽量少的使用foreach循环,为什么要尽量避免使用foreach ?。GC Alloc是造成Unity游戏偶尔卡帧的罪魁祸首。第一个循环大概会造成2.3K的GC Alloc。第二个循环则没有任何GC Alloc。所以,不要途方便,哪都用foreach循环。

如果不使用foreach字典要如何遍历呢,下面代码中就详细的介绍了如何使用for循环来遍历字典,代码关键处都有注释详解,如果有不懂或者疑惑的地方,欢迎加群讨论,群号在网站最上面。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class DictionaryExample : MonoBehaviour {
    //定义一个people类来保存信息
    public class people
    {
        public string name = "name";
        public int age = 0;
        public Color color = Color.white;
    }
    //定义一个字典存储people
    Dictionary<int, people> peopleDic = new Dictionary<int, people>();
 
	// Use this for initialization
	void Start () {
        //people初始化
        for (int i = 0; i < 10; i++)
        {
            people peo = new people();
            peo.name = "小明 " + i;
            peo.age = 18 + i;
            int a = Random.Range(0, 3);
            switch (a)
            {
                case 0:
                    peo.color = Color.white;
                    break;
                case 1:
                    peo.color = Color.yellow;
                    break;
                case 2:
                    peo.color = Color.black;
                    break;
                default:
                    break;
            }
            //将people添加到字典中
            peopleDic.Add(i, peo);
        }
	}
 
    private void OnGUI()
    {
        if (GUI.Button(new Rect(0,0,100,50), "foreach遍历"))
        {
            foreach (people item in peopleDic.Values)
            {
                string skin = "肤色";
                if (item.color == Color.white)
                {
                    skin = "白皮肤";
                }
                else if(item.color == Color.black)
                {
                    skin = "黑皮肤";
                }else
                {
                    skin = "黄皮肤";
                }
                print("姓名 :" + item.name + "| 年龄 : " + item.age+" | 肤色 : "+ skin);
            }
        }
        if (GUI.Button(new Rect(110, 0, 100, 50), "for遍历"))
        {
            List dicList = new List(peopleDic.Keys);
            for (int i = 0; i < dicList.Count; i++)
            {
                people item = peopleDic[dicList[i]];
                string skin = "肤色";
                if (item.color == Color.white)
                {
                    skin = "白皮肤";
                }
                else if (item.color == Color.black)
                {
                    skin = "黑皮肤";
                }
                else
                {
                    skin = "黄皮肤";
                }
                print("姓名 :" + item.name + "| 年龄 : " + item.age + " | 肤色 : " + skin);
            }
        }
    }
}

foreach循环的打印结果:

姓名 :小明 0| 年龄 : 18 | 肤色 : 白皮肤
姓名 :小明 1| 年龄 : 19 | 肤色 : 黄皮肤
姓名 :小明 2| 年龄 : 20 | 肤色 : 黑皮肤
姓名 :小明 3| 年龄 : 21 | 肤色 : 黑皮肤
姓名 :小明 4| 年龄 : 22 | 肤色 : 黑皮肤
姓名 :小明 5| 年龄 : 23 | 肤色 : 白皮肤
姓名 :小明 6| 年龄 : 24 | 肤色 : 黄皮肤
姓名 :小明 7| 年龄 : 25 | 肤色 : 黄皮肤
姓名 :小明 8| 年龄 : 26 | 肤色 : 黄皮肤
姓名 :小明 9| 年龄 : 27 | 肤色 : 白皮肤

for循环的打印结果:

姓名 :小明 0| 年龄 : 18 | 肤色 : 白皮肤
姓名 :小明 1| 年龄 : 19 | 肤色 : 黄皮肤
姓名 :小明 2| 年龄 : 20 | 肤色 : 黑皮肤
姓名 :小明 3| 年龄 : 21 | 肤色 : 黑皮肤
姓名 :小明 4| 年龄 : 22 | 肤色 : 黑皮肤
姓名 :小明 5| 年龄 : 23 | 肤色 : 白皮肤
姓名 :小明 6| 年龄 : 24 | 肤色 : 黄皮肤
姓名 :小明 7| 年龄 : 25 | 肤色 : 黄皮肤
姓名 :小明 8| 年龄 : 26 | 肤色 : 黄皮肤
姓名 :小明 9| 年龄 : 27 | 肤色 : 白皮肤

END —->>有什么不对的地方请下方留言 ,有问题欢迎加群讨论 bye~