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)