场景:我有一个 List<ISSLogMessage> records 数据,需要从里面删除指定内容数据
第一次写成
cs
foreach(var item in records)
{
if (item.logMessage.Contains("上传通行记录"))
records.Remove(item);
}
直接报错,因为foreach 是个迭代器 直接移除它的对象会报错
第二次换成 for
cs
for (int i = 0; i < records.Count; i++)
{
ISSLogMessage item = records[i];
item.moduleName = $"{_gateSentryManager.GateSentryInfo.Name}";
if (item.logMessage.Contains("上传通行记录"))
records.Remove(item);
}
不报错了,可以跑了,但是有BUG ???
如果 需要移除的数据是相邻的,那么后面的元素将不会移除
出现问题:未能删除相邻元素后一个
原因:ArrayList的底层结构是数组类型,数组删除某个元素时,后面所有元素的索引都会往前移,而此时for循环的指针是却是往后移动 ..........................
第三次
cs
List<int> rids = new List<int>();
for (int i = 0; i < records.Count; i++)
{
ISSLogMessage item = records[i];
item.moduleName = $"{_gateSentryManager.GateSentryInfo.Name}";
if (item.logMessage.Contains("上传通行记录"))
rids.Add(i);
}
foreach (int i in rids)
{
records.RemoveAt(i);
}
还是有问题 ....................
本着觉得写得有点复杂得想法查了下网络 可以写成
cs
IEnumerator rator = records.GetEnumerator();//1.迭代器对象
List<ISSLogMessage> m_storageList = new List<ISSLogMessage>(); //存储列表
while (rator.MoveNext()) //2.循环条件
{
ISSLogMessage item = (ISSLogMessage)rator.Current;//3.当前值
item.moduleName = $"{_gateSentryManager.GateSentryInfo.Name}";
if (!item.logMessage.Contains("上传通行记录"))
m_storageList.Add(item);
}
records = m_storageList;
还是新添加靠谱啊