我有一个WPF应用程序,我有一个硬币喷泉。每隔10毫秒,coin[i]
会被list
添加到名为coins
的{{1}}。这些硬币生成一个动画,用于查找带有此语句的硬币for (int i = 0; i < coins.Count; i++)
。要删除我调用的对象:
if (coins[i].Top > 550)
{
coins.RemoveAt(i);
canvas.Children.Remove(coin[i]);
}
( top 是使用保证金设置最高排名的类的一部分。)
但是,当使用coins.RemoveAt(i);
时,列表编号也会被删除,因此列表编号中的所有其他项目都将向下移动以关闭&#34;间隙&#34;。有什么方法可以阻止它在删除项目时填补&#34;间隙&#34;?
答案 0 :(得分:2)
使用以下代码替换For循环。这将找到具有Top属性&gt;的所有硬币。 550然后迭代它们从硬币列表和canvas.Children集合中删除它们。
var coinsToRemove = coins.Where(coin => coin.Top > 550);
foreach (var coin in coinsToRemove)
{
coins.Remove(coin);
canvas.Children.Remove(coin);
}
答案 1 :(得分:0)
coins.Insert(i,new coin());是我认为可以解决你的“填补空白”问题的额外代码行。我的解决方案是用空物体填补空白。 请参阅下面的我的测试用例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication8
{
class Program
{
class b
{
public int i;
public b(int x) { i = x; } //Constructor which instantiates objects with respective properties
public b() { } //Constructor for empty object to fill gap
}
static void Main(string[] args)
{
List<b> integers = new List<b>(); //List of objects
integers.Add(new b(5)); //Add some items
integers.Add(new b(6));
integers.Add(new b(7));
integers.Add(new b(8));
for (int i = 0; i < integers.Count; i++)
{
Console.WriteLine(integers[i].i); //Do something with the items
}
integers.RemoveAt(1); //Remove the item at a specific index
integers.Insert(1, new b()); //Fill the gap at the index of the remove with empty object
for (int i = 0; i < integers.Count; i++) //Do the same something with the items
{
Console.WriteLine(integers[i].i); //See that The object that fills the gap is empty
}
Console.ReadLine(); //Wait for user input I.E. using a debugger for test
}
}
}