你可以在C#中迭代它时从List <>中删除一个项目吗?

Chr*_*ris 4 .net c# iteration silverlight list

你可以在迭代它时从List <>中删除一个项目吗?这会有用,还是有更好的方法呢?

我的代码:

foreach (var bullet in bullets)
  {
    if (bullet.Offscreen())
    {
      bullets.Remove(bullet);
    }
  }
Run Code Online (Sandbox Code Playgroud)

-edit-对不起,伙计们,这是一个银色的游戏.我没有意识到Silverlight与Compact Framework不同.

Sam*_*ell 17

bullets.RemoveAll(bullet => bullet.Offscreen());
Run Code Online (Sandbox Code Playgroud)

编辑:要使此功能在Silverlight中按原样运行,请将以下扩展方法添加到项目中.

类似地List<T>.RemoveAll,该算法是O(N),其中N是列表的长度而不是O(N*M),其中M是从列表中移除的元素的数量.由于它是一个扩展方法,其原型与RemoveAll非Silverlight框架中的方法相同,因此内置的扩展方法将在可用时使用,并且这一方法可以无缝地用于Silverlight构建.

public static class ListExtensions
{
    public static int RemoveAll<T>(this List<T> list, Predicate<T> match)
    {
        if (list == null)
            throw new NullReferenceException();

        if (match == null)
            throw new ArgumentNullException("match");

        int i = 0;
        int j = 0;

        for (i = 0; i < list.Count; i++)
        {
            if (!match(list[i]))
            {
                if (i != j)
                    list[j] = list[i];

                j++;
            }
        }

        int removed = i - j;
        if (removed > 0)
            list.RemoveRange(list.Count - removed, removed);

        return removed;
    }
}
Run Code Online (Sandbox Code Playgroud)


Rex*_*x M 10

编辑:澄清一下,问题是关于Silverlight,它显然不支持List`T上的RemoveAll.它在完整的框架,CF,XNA版本2.0+中可用

您可以编写表示删除条件的lambda:

bullets.RemoveAll(bullet => bullet.Offscreen());
Run Code Online (Sandbox Code Playgroud)

或者您可以选择您想要的那些,而不是删除您不想要的那些:

bullets = bullets.Where(b => !b.OffScreen()).ToList();
Run Code Online (Sandbox Code Playgroud)

或者使用索引器向后移动序列:

for(int i=bullets.Count-1;i>=0;i--)
{
    if(bullets[i].OffScreen())
    {
        bullets.RemoveAt(i);
    }
}
Run Code Online (Sandbox Code Playgroud)