CSharp for和foreach循环遍历字典
最近刚接手了新的新项目,发现项目中使用了大量的foreach循环遍历字典,在使用unity的时候,要尽量少的使用foreach循环,为什么要尽量避免使用foreach ?。GC Alloc是造成Unity游戏偶尔卡帧的罪魁祸首。第一个循环大概会造成2.3K的GC Alloc。第二个循环则没有任何GC Alloc。所以,不要途方便,哪都用foreach循环。
如果不使用foreach字典要如何遍历呢,下面代码中就详细的介绍了如何使用for循环来遍历字典,代码关键处都有注释详解,如果有不懂或者疑惑的地方,欢迎加群讨论,群号在网站最上面。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
| 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循环的打印结果:
1 2 3 4 5 6 7 8 9 10
| 姓名 :小明 0| 年龄 : 18 | 肤色 : 白皮肤 姓名 :小明 1| 年龄 : 19 | 肤色 : 黄皮肤 姓名 :小明 2| 年龄 : 20 | 肤色 : 黑皮肤 姓名 :小明 3| 年龄 : 21 | 肤色 : 黑皮肤 姓名 :小明 4| 年龄 : 22 | 肤色 : 黑皮肤 姓名 :小明 5| 年龄 : 23 | 肤色 : 白皮肤 姓名 :小明 6| 年龄 : 24 | 肤色 : 黄皮肤 姓名 :小明 7| 年龄 : 25 | 肤色 : 黄皮肤 姓名 :小明 8| 年龄 : 26 | 肤色 : 黄皮肤 姓名 :小明 9| 年龄 : 27 | 肤色 : 白皮肤
|
for循环的打印结果:
1 2 3 4 5 6 7 8 9 10
| 姓名 :小明 0| 年龄 : 18 | 肤色 : 白皮肤 姓名 :小明 1| 年龄 : 19 | 肤色 : 黄皮肤 姓名 :小明 2| 年龄 : 20 | 肤色 : 黑皮肤 姓名 :小明 3| 年龄 : 21 | 肤色 : 黑皮肤 姓名 :小明 4| 年龄 : 22 | 肤色 : 黑皮肤 姓名 :小明 5| 年龄 : 23 | 肤色 : 白皮肤 姓名 :小明 6| 年龄 : 24 | 肤色 : 黄皮肤 姓名 :小明 7| 年龄 : 25 | 肤色 : 黄皮肤 姓名 :小明 8| 年龄 : 26 | 肤色 : 黄皮肤 姓名 :小明 9| 年龄 : 27 | 肤色 : 白皮肤
|
END —->>有什么不对的地方请下方留言 ,有问题欢迎加群讨论 bye~