c#删除列表对象

本文关键字:对象 列表 删除列 删除 | 更新日期: 2023-09-27 18:12:41

我有一个WPF应用程序,我有一个硬币喷泉。每隔10毫秒,一个coin[i]被添加到称为coinslist中。这些硬币生成与一个动画,找到硬币与此声明for (int i = 0; i < coins.Count; i++)。要删除对象,我调用:

if (coins[i].Top > 550)
{
    coins.RemoveAt(i);
    canvas.Children.Remove(coin[i]);
}

(top是使用margin设置顶部位置的类的一部分)。

然而,当使用coins.RemoveAt(i);时,列表号也被删除,因此列表号中的所有其他项目将被向下移动以关闭"差距"。当移除项目时,有没有办法阻止它填补"空白"?

c#删除列表对象

用下面的代码替换For循环。这将找到Top属性> 550的所有硬币,然后迭代它们,将它们从硬币列表和画布中删除。孩子们收集。

var coinsToRemove = coins.Where(coin => coin.Top > 550);
foreach (var coin in coinsToRemove)
{
    coins.Remove(coin);
    canvas.Children.Remove(coin);
}

硬币。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
        }
    }
}