我有一个字符串集合,其中填充了ID,如此 - >
12345
23456
34567
等等。我需要做的是根据用户的请求,当满足某些参数时,从顶部开始遍历该列表,并使用该ID执行方法()。如果成功,我会将其从列表中删除并继续。
我很尴尬地以这种方式从未使用过一个系列。有人能指出我正确的方向。示例似乎都属于Console.Writeline("");
种类。
我的基础,无知,尝试看起来像这样 - >
var driUps = Settings.Default.DRIUpdates.GetEnumerator();
while (driUps.MoveNext())
{
var wasSuccessfull = PerformDRIUpdate(driUps.Current);
if (wasSuccessfull)
{
driUps.Current.Remove(driUps.Current.IndexOf(driUps.Current));
}
}
我最关心的部分是Remove();
是不是有更好的方法来获得当前指数?任何和所有提示,提示,批评,指针等....欢迎。谢谢!
答案 0 :(得分:4)
在枚举期间关注'删除'是完全正确的。这样的事情怎么样:
int idx = 0;
while (idx < strCol.Count)
{
var wasSuccessful = PerformDRIUpdate(strCol[idx]);
if (wasSuccessful)
strCol.RemoveAt(idx);
else
++idx;
}
答案 1 :(得分:1)
正如n8wrl所建议的,使用RemoveAt解决了在枚举集合时尝试删除项目的问题,但是对于大型集合,从前面删除项目会导致性能问题,因为重新构建了基础集合。从集合的末尾开始工作并从中删除项目:
//Loop backwards, as removing from the beginning
//causes underlying collection to be re-built
int index = (strCol.Count - 1);
while (index >= 0)
{
if (PerformDRIUpdate(strCol[index]))
{
strCol.RemoveAt(index);
}
--index;
}
答案 2 :(得分:0)
迭代枚举器最好用foreach()完成,它执行一个GetEnumerator()并在你的内容下创建一个类似的块,语法是:
foreach(ObjectType objectInstance in objectInstanceCollection)
{
do something to object instance;
}
给你,
List<DRIUpdate> updatesToRemove = new List<DRIUpdate>();
foreach(DRIUpdate driUpdate in Settings.Default.DRIUpdates)
{
if (PerformDRIUpdate(driUpdate))
{
updatesToRemove.Add(driUpdate);
}
}
foreach(DRIUpdate driUpdate in updatesToRemove)
{
Settings.Default.DRIUpdates.Remove(driUpdate);
}
答案 3 :(得分:0)
如果driUps
是IEnumerable<T>
,请尝试以下操作:
driUps = driUps.Where(elem => !PerformDRIUpdate(elem));
<强>更新强>
从示例中看,这似乎更合适:
Settings.Default.DRIUpdates =
Settings.Default.DRIUpdates.Where(elem => !PerformDRIUpdate(elem));
对于List<T>
,它更简单:
list.RemoveAll(PerformDRIUpdate);