如何从包含多个对象的列表中删除从列表框中选择的项目?

How to remove an item selected from a listbox from a list containing multiple objects?

我希望用户能够 select 列表框中的项目,然后按删除按钮,以便从列表框和 allFlights 列表中删除该项目。我怎样才能更改我的代码,以便它也从 allFlights 列表中删除该项目?

public partial class Form1 : Form
{
    public List<Flight> allFlights;
    
    public Form1()
    {
        InitializeComponent();
        allFlights = new List<Flight>();

        Flight flight1 = new Flight("BA431", "Newcastle", "13:00");
        Flight flight2 = new Flight("KL126", "Manchester", "16:00");
        Flight flight3 = new Flight("CD230", "London", "14:00");
        allFlights.Add(flight1);
        allFlights.Add(flight2);
        allFlights.Add(flight3);
        allFlights.Sort();

        DisplayArrivals();
    }

    public void DisplayArrivals()
    {
        foreach (Flight f in allFlights)
        {
            lstArrivals.Items.Add(f.ToString());
        }
    }

    private void btnDeleteF_Click(object sender, EventArgs e)
    {
        for (int i = lstArrivals.SelectedIndices.Count - 1; i >= 0; i--)
        {
            lstArrivals.Items.RemoveAt(lstArrivals.SelectedIndices[i]);                
        }
    }
}

这应该可以解决问题:

for (int i = lstArrivals.SelectedIndices.Count - 1; i >= 0; i--)
{
    allFlights.Remove(lstArrivals.Items[lstArrivals.SelectedIndices[i]]);
    lstArrivals.Items.RemoveAt(lstArrivals.SelectedIndices[i]);
}

在您的 DisplayArrivals() 方法中,不要将 f.ToString() 添加到您的列表框,而是添加 Flight 实例本身,如 lstArrivals.Items.Add(f):

public void DisplayArrivals()
{
    foreach (Flight f in allFlights)
    {
        lstArrivals.Items.Add(f); // <-- add the Flight instance itself
    }
}

确保为您的 Flight class 覆盖 ToString() 以控制它在列表框中的显示方式。

然后您可以将所选项目转换回 Flight 实例并使用该引用将其从您的列表中删除:

private void btnDeleteF_Click(object sender, EventArgs e)
{
    for (int i = lstArrivals.SelectedIndices.Count - 1; i >= 0; i--)
    {
        Flight f = lstArrivals.Items[lstArrivals.SelectedIndices[i]] as Flight;
        lstArrivals.Items.RemoveAt(lstArrivals.SelectedIndices[i]);
        allFlights.Remove(f);
        // ... possibly do something else with "f" ...
    }
}