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~