C#for和foreach的区别-----dictionary遍历的方式

一、遍历方式

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;
    }




             

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页