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

本文关键字:字典 读取 | 更新日期: 2023-09-27 18:37:06

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

每个"项目"都有一个位置 ID。当我输入此位置并按"查看"时。程序应该检查我在哪个位置,并只取出具有相同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,并检查每个条目。但就像上面提到的。这似乎是浪费处理。

有什么想法或提示吗?在代码方面朝着正确的方向推动将不胜感激。

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

您正在做的是将整数值存储在由您正在使用的字符串键的哈希指定的位置。

更好的主意是使用 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 方法,则对于简化我提到的密钥检查非常有用。

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

字典,

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

但是,您可以使用列表作为值。因此,如果要在同一位置创建项目集合并在以后重复使用,则可以将其存储在字典中,其中键是位置ID:字典>

我希望它有所帮助

字典

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

字典

可以让您有效地根据位置查找项目,或者有效地基于项目查找位置,但不能两者兼而有之。(这并不是说以另一种方式做到这一点并不是非常低效,只是效率更低,通常是 O(n) 而不是更快的东西。

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

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

我推荐

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

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

Dictionary<int, List<string>>

int 是房间

ID(001、011 等),列表是存储在每个房间中的对象。给定房间 ID,您现在可以循环访问存储在该房间中的所有内容的列表。