一、遍历方式
dictionary遍历的方式有两种:一种是通过foreach,一种是通过for来实现遍历。
Dictionary<string,string> list=new Dictionary<string,string>;
foreach(var item in list)
{
Console.WriteLine(item.Key+item.Value);
}
//KeyValuePair<T,K>
foreach(KeyValuePair<string,string> kv in list)
{
Console.WriteLine(kv.Key+kv.Value);
}
//通过键的集合取
foreach(string key in list.Keys)
{
Console.WriteLine(key+list[key]);
}
//for循环遍历
List<string> test=new List<string>(list.Keys);
for(int i=0;i<list.Count;i++)
{
Console.WriteLine(test[i]+list[test[i]]);
}
二、注意事项:
对于基本类型的集合,foreach可以任意修改集合中元素。对于引用类型的集合(如studentEntity),不能进行元素的添加或删除等改变引用的操作。否则会报错:Collection Was modified;enumeration Operation may not execute,当用foreach遍历Collection时,如果Collection有Add或者Remove操作或者给item某个属性赋值都会有这个错误。但可以改变元素(对象)的属性(如改变studentEntity的name属性为张三)。
三、移除元素
上文已经提到了移除dictionary(Collection)中的元素,不能使用foreach,只能使用for来实现。
for(int i=0;i<list.count;i++)
{
if(list[i])
{
list.RemoveAt(i);
}
}
如果这样循环,肯定不对,{A B C D E F G H}假设当前遍历到D(i=3),移除,接着遍历i=4(F),此时跳过了E。
我们使用倒序遍历,这个问题就能迎刃而解啦。
for(int i=list.Count-1;i>=0;i--)
{
if(list[i])
{
list.RemoveAt(i);
}
}
项目中用到的真实代码:
public static OperationResult CheckAddOrUpdateMetaFields(ObjectData objectData)
{
OperationResult result = new OperationResult();
result.Code = 200;
Dictionary<string, Data> dictionaryFields = objectData.MetaFields; //任务所有的字段
List<string> allowedList = TaskManageConst.GetAllowedMetaFieldsList();
for (int i = 0; i < dictionaryFields.Count; i++)
{
if (!allowedList.Contains(dictionaryFields.ElementAt(i).Key))//key不在allowedList,移除
{
dictionaryFields.Remove(dictionaryFields.ElementAt(i).Key);
i--;
}
}
return result;
}