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 クラスを正しく使用していません。辞書は、既知のキー値に基づいてすばやくアクセスするのに最適です。毎回キーを検索する必要がある場合は、辞書が提供するすべての利点が失われます。

/ メソッドを使用して、単純な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 に答える