1

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

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;
    }
}

我尝试了正常的方法,但因为我有单选按钮来对列表框进行排序,因为索引已更改,所以它搞砸了。

例如

//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

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

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

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

4

1 回答 1

3

你说你的字典的键是由字典中的当前项目数决定的。如果是这种情况,您必须执行以下操作:

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

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

您也可以使用/ 方法List<Item>来代替简单的:FindIndexRemoveAt

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);

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

于 2013-09-09T22:21:51.250 回答