我有一个列表框,用于打印自定义项类的名称
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属性进行比较?
答案 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);
这是一种更加高效和优雅的解决方案。