3

c# 新手。我正在尝试制作一个简单的系统,我可以在其中搜索对象列表以及它何时属于某个 ID。把它放在 List/ArrayList 中,这样我就可以读出来/做任何其他事情。

每个“项目”都有一个 locationID。当我进入这个位置并按“看”。该程序应该检查我在哪个位置,并只取出具有相同 ID 的“项目”。

在实践中。项目列表将非常大(以及位置)。因此,一次又一次地浏览列表似乎是一种浪费。这就是我想用字典的原因。但我似乎无法访问字典中的多个条目,只能在一个特定位置访问。

例如:

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

您没有就您的问题的限制向我们提供足够的信息。ADictionary<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

根据定义,字典对每个键都有一个值。您不能使用单个键访问多个值。

但是,您可以使用 List 作为值。因此,如果您想在同一位置创建项目集合并稍后重用它,您可以将其存储在 key 为 locationID 的字典中: Dictionary>

我希望它有帮助

于 2012-06-12T15:13:37.930 回答
0

字典提供从值的映射,但反之则不然。您可以构建另一个字典,其中位置 ID 作为键,项目集合作为值,并以这种方式查找位置 ID

于 2012-06-12T15:13:50.827 回答
0

字典可以让您有效地根据位置找到项目,或者让您有效地根据项目找到位置,但不能两者兼而有之。(这并不是说以另一种方式执行它并不是非常低效,只是更少,通常是 O(n),而不是更快。)

所以,你有几个可能性。最简单的就是简单地迭代itemLoc.Values并寻找你想要的东西。更复杂的是维护第二个集合 a Dictionary<int, List<string>>,它将存储每个位置的整个项目列表。这将使查找变得非常快速和容易,代价是维护数据(插入、更新、删除)的更多工作。

这完全取决于您要优化的内容。在最极端的情况下,您可以放弃Dictionary<string,int>并使用Dictionary<int, List<string>>独占,当您需要查找某个项目的位置时进行搜索——但您只想在这种查找类型非常罕见的情况下这样做。

于 2012-06-12T15:16:26.080 回答
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

代码现在的样子,你只能拥有一支笔、纸等。这是因为您将它们用作字典的键。完成这项任务的更好方法是拥有一个

Dictionary<int, List<string>>

int 将是房间 id (001, 011, 等),列表将是存储在每个房间中的对象。给定房间 ID,您现在可以遍历该房间中存储的所有内容的列表。

于 2012-06-12T15:38:52.207 回答