根据列表框选择从字典中删除项目

时间:2013-09-09 22:15:45

标签: c# .net dictionary listbox

我有一个列表框,用于打印自定义项类的名称

public class Item
{
    public string @Url { get; set; }
    public string Name { get; set; }
    public double Price { get; set; }

    public Item(string @url, string name, double price)
    {
        this.Url = url;
        this.Name = name;
        this.Price = price;
    }

    public override string ToString()
    {
        return this.Name;
    }
}

我尝试了常规方法,但因为我有单选按钮来对列表框进行排序,所以它会因为索引被更改而混乱。

EG

//new item is declared
Dictionary<int, Item> itemList = Dictionary<int, Item> { new Item("f.ca", "name1", 33);
                                                      new Item("m.ca", "name2", 44); }
//Items added to listbox
for (int v = 0; v < itemList.Count; v++)
{
    itemListBox.Items.Add(itemList[v].Name);
}

//start sorting
var priceSort = from item in itemList
                orderby item.Value.Price
                select new { item.Value.Name, item.Value.Price };

itemListBox.Items.Clear();
foreach (var i in priceSort)
{
    itemListBox.Items.Add(i.Name);
}              
//end sorting listbox updated

现在创建了新列表,因为该框已更新,因此只需删除项目列表中的项目。

/* This code is what i thought but SelectedIndex say if on 0 and since the sorted by price */
itemList.Remove(itemListBox.SelectedIndex);

现在问题是当项目[1]确实是需要删除的项目时,它试图删除项目[0]。有没有办法让它将itemlistbox的字符串与items字典的.Name属性进行比较?

1 个答案:

答案 0 :(得分:3)

您声明字典的键是由字典中当前的项目数决定的。如果是这种情况,你必须做这样的事情:

var matches = itemList.Where(x => x.Name == itemListBox.SelectedValue);
if (matches.Any())
{
    itemList.Remove(matches.First().Key);
}

但这很慢而且不优雅。你真的没有正确使用Dictionary类。字典是基于已知键值执行快速访问的理想选择。如果您每次都必须搜索密钥,那么您将失去字典提供的所有好处。

您也可以使用FindIndex / RemoveAt方法使用简单的List<Item>

var index = itemList.FindIndex(x => x.Name == itemListBox.SelectedValue);
if (index != -1)
{
    itemList.RemoveAt(index);
}

这不是更快,但它更优雅 - 列表专门用于支持这种事情,而不必诉诸Linq。

或者更好的是,使用项目的名称作为字典键:

Dictionary<string, Item> itemList = Dictionary<string, Item>();
itemList.Add("name1", new Item("f.ca", "name1", 33));
itemList.Add("name2", new Item("m.ca", "name2", 44));

...

itemList.Remove(itemListBox.SelectedValue);

这是一种更加高效和优雅的解决方案。