c#读取字典中相同值的所有条目/

时间:2012-06-12 15:09:10

标签: c# dictionary

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

每个“item”都有一个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,并检查每个条目。但如上所述。这似乎是对处理的浪费。

任何想法或提示? 对代码方向正确方向的推动将非常感激。

7 个答案:

答案 0 :(得分: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() - 类型的方法,那么这对于简化我提到的密钥检查会很有用。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

根据定义,字典对每个键都有一个值。您无法使用单个密钥访问多个值。

但是,您可以使用List作为值。因此,如果您想在同一位置创建项目集合并在以后重复使用,则可以将其存储在其中键为locationID的字典中​​:Dictionary&gt;

我希望它有所帮助

答案 3 :(得分:0)

Dictionary提供值的映射,但不是相反。您可以构建另一个字典,其中包含作为键的位置ID和作为值的项集合,并以这种方式查找位置ID

答案 4 :(得分:0)

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

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

所有关于你想要优化的内容。在最极端的情况下,您可以放弃Dictionary<string,int>并独占使用Dictionary<int, List<string>>,在需要查找商品的位置时搜索 - 但您只想这样做查找类型非常罕见。

答案 5 :(得分:0)

我建议

Dictionary<int, List<string>>

这样您就可以为每个位置添加多个项目

e.g。

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

答案 6 :(得分:0)

现在代码的样子,你只能拥有一支笔,纸,等等。这是因为您使用它们作为字典的键。

是一个更好的方法来完成这项任务

Dictionary<int, List<string>>

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