关于引用类型和值类型一点体会

有List<Item>数据结构如下:

Name Number
A 2
A 3
B 7

 

 

 

现在需要把Name相同的项合并,Number累加,就是下表:

Name   Number
A 5
B 7

 

 

 

虽然逻辑可以控制List无重复项,为了保险,我选择用Dictionary作为中间对象来实现功能,代码如下:

 1         public List<Item> MergeData(List<Item> dataList)
 2         {
 3             List<Item> targetList= new List<Item>();
 4             Dictionary<string, Item> tempDic= new Dictionary<string, Item>();
 5             Item item;
 6             for (int i = 0; i < dataList.Count; i++)
 7             {
 8                 item= dataList[i];
 9                 if (tempDic.Keys.Contains(item.Name))
10                 {
11                     tempDic[item.Name].Number+= item.Number;
12                 }
13                 else
14                 {
15                     tempDic.Add(item.Name,item.Number);
16                 }
17             }
18             if (!Utility.isNullOrEmpty(resultDic))
19             {
20                 foreach (Item resultItem in tempDic.Values)
21                 {
22                     targetList.Add(resultItem);
23                 }
24             }
25             return targetList;
26         }


运行的结果如下:

targetList打印输出的结果是期望的结果:

Name   Number
A 5
B 7

 

 

 

但是原dataList变成了:

Name   Number
A 5
A 3
B 7

 

 

 

这里的问题就出在Line 8 >>  item=dataList[i];

C#是引用类型,看起来,我们在For循环的Line 11把 Dictionary的Key为A的Value(Item)的Number累加了一次,变成了5,这没有一点问题,可是由于Item是一个对象,类型是Object,属于引用类型,所以原List中的第一个对象A的值Number也变成了5

 

posted @ 2015-11-03 10:36  CeeChen  阅读(272)  评论(0编辑  收藏  举报