3

C#の新機能。オブジェクトのリストを検索し、それが特定の ID に属しているときに検索できる単純なシステムを作成しようとしています。それを List/ArrayList に入れて、それを読み取ったり、他のことをしたりできるようにします。

各「アイテム」には locationID があります。この場所に入って「見る」を押すと。プログラムは、私がどの場所にいるのかを確認し、同じ ID を持つ「アイテム」のみを取り出す必要があります。

実際には。アイテムのリストはかなり大きくなります (そして場所も)。そのため、リストを何度も調べるのは処理の無駄に思えます。そこで、辞書を使おうと思いました。しかし、辞書の複数のエントリにアクセスすることはできず、特定の 1 つの場所にしかアクセスできないようです。

例えば:

Dictionary<string, int> itemLoc = new Dictionary<string, int>();
itemLoc.Add("pen", 011);
itemLoc.Add("paper", 011);
itemLoc.Add("tv remote", 012);

//print everything in location 011

コード不足で申し訳ありません。私はまだこれを回避する方法を考えています。私は ArrayLists、Lists、Hashtables、およびこれらの辞書を調査してきました。しかし、何もなくても、私が探しているものを効果的に達成することができました.

foreach を実行して、各エントリを確認できます。しかし、前述のとおりです。それは処理の無駄に思えます。

アイデアやヒントはありますか?コードに関して正しい方向に微調整していただければ幸いです。

4

7 に答える 7

3

あなたがしているのは、利用している文字列キーのハッシュによって指定された場所に整数値を格納することです。

より良いアイデアは、Dictionary<int, List<string>>(またはリストクラスのためにC#が持っているものは何でも)使用itemLoc.Add(011, new List<string>()); itemLoc.Get(011).Add("pen");することです。場所に最初のアイテムを追加するときのように(その場所が辞書のキーとして存在するかどうかを確認したいでしょう)最初)、そしてその直後itemLoc.Get(011).Add("paper");

私自身は C# を使用したことがないため、構文が正しくない可能性があることに注意してください。ただし、それほど異なるものではありません。また、C# ディクショナリ クラスにAddIfAbsent()-type メソッドがある場合、前述のキーチェックを簡素化するのに役立ちます。

于 2012-06-12T15:14:39.917 に答える
1

問題の制約について十分な情報が提供されていません。A のDictionary<string, List<string>>方が高速に実行されますが、複数の場所に複数のアイテムを配置できるかどうかを特定していません (たとえば、「紙」を 011 と 012 に配置したり、011 だけに配置したりできますか?) その場合、追加するたびに、アイテムがまだ別の場所にないことを確認します。

非常に単純化されたアプローチは、非常に単純化して分解し、結果に基づいて最適化することです.

class MyItem
{
    public string Name { get; set; }
    public string Location { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        List<MyItem> myItems = new List<MyItem>()
        {
            new MyItem() { Location = "011", Name = "pen" },
            new MyItem() { Location = "011", Name = "paper" },
            new MyItem() { Location = "012", Name = "tv remote" }
        };

        var specificItems = myItems.Where(f => f.Location == "011");

        foreach (var item in specificItems)
        {
            Console.WriteLine(item.Name);
        }

        Console.Read();
    }
}

ベンチマークを実行したら、何かに切り替えることを検討できます (おそらくDictionary<string, List<string>>

于 2012-06-12T15:22:29.273 に答える
0

私はお勧めします

Dictionary<int, List<string>>

このようにして、各場所に複数のアイテムを追加できます

例えば

var locItems = new Dictionary<int, List<string>>();

List<string> items = new List<string>() { "item1", "Item2", "item3" };

locItems.Add(1, items);

// Get all items from location 1 ...
List<string> items = locItems[1];

foreach(string s in items)
    Console.WriteLine(s);

// Now add another item to the list
items.Add("Some new item");

// Since this is by ref - the list in the dict will be modified 
// so you don't need to worry about re-adding it to the dict
于 2012-06-12T15:19:46.000 に答える
0

ディクショナリは、定義上、各キーに対して 1 つの値を持ちます。1 つのキーで複数の値にアクセスすることはできません。

ただし、List を値として使用することはできます。したがって、同じ場所にアイテムのコレクションを作成し、後で再利用する場合は、キーが locationID である辞書に保存できます。

役立つことを願っています

于 2012-06-12T15:13:37.930 に答える
0

ディクショナリはキーから値のマッピングを提供しますが、その逆は提供しません。ロケーションIDをキーとして、アイテムのコレクションを値として持つ別の辞書を作成し、その方法でロケーションIDを検索できます

于 2012-06-12T15:13:50.827 に答える
0

辞書を使用すると、場所に基づいてアイテムを効率的に見つけるか、アイテムに基づいて場所を効率的に見つけることができますが、両方を見つけることはできません。(それは、他の方法でそれを行うのが恐ろしく非効率的であると言っているわけではありませんが、それほど効率的ではなく、一般的に O(n) よりも高速なものではありません。)

したがって、いくつかの可能性があります。最も単純な方法は、単純に反復しitemLoc.Valuesて必要なものを探すことです。Dictionary<int, List<string>>より複雑なのは、場所ごとのアイテムのリスト全体を格納する 2 番目のコレクション a を維持することです。これにより、検索が非常に高速かつ簡単になりますが、データを維持するための作業 (挿入、更新、削除) が増えます。

何を最適化するかがすべてです。最も極端なケースでは、 を捨てて だけDictionary<string,int>を使用しDictionary<int, List<string>>て、アイテムの場所を見つける必要があるときにそれを検索することができますが、そのタイプの検索が非常にまれな場合にのみそれを実行する必要があります。

于 2012-06-12T15:16:26.080 に答える
0

The way the code looks now, you'll only be allowed to have a single pen, paper, ect. This is because you are using them as the keys to the dictionary. A better way of accomplishing this task would be to have a

Dictionary<int, List<string>>

The int would be the room id (001, 011, ect) and the list would be the object stored in each room. Given the room id, you can now iterate through the list of all things stored in that room.

于 2012-06-12T15:38:52.207 に答える