获取当前字符串集合中的删除索引

时间:2010-07-26 19:49:43

标签: c# .net collections enumeration

我有一个字符串集合,其中填充了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();是不是有更好的方法来获得当前指数?任何和所有提示,提示,批评,指针等....欢迎。谢谢!

4 个答案:

答案 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)

如果driUpsIEnumerable<T>,请尝试以下操作:

driUps = driUps.Where(elem => !PerformDRIUpdate(elem));

<强>更新

从示例中看,这似乎更合适:

Settings.Default.DRIUpdates = 
  Settings.Default.DRIUpdates.Where(elem => !PerformDRIUpdate(elem));

对于List<T>,它更简单:

list.RemoveAll(PerformDRIUpdate);