【问题标题】:Which data structure should I use for having sorted data, where the key can be used on multiple entries我应该使用哪种数据结构来对数据进行排序,其中的键可以用于多个条目
【发布时间】:2013-12-26 19:21:27
【问题描述】:

我有一些数据要存储在其中我有一个查找相关对象的键,但键不是唯一的,同一个键可以有多个指针。

我希望能够将这些数据放入一个有点像 SortedList 的结构中,但它需要唯一的键才能工作。

是否有任何开箱即用的 C# 对象可以让我这样做。在下面的示例中,我使用字符串作为引用对象,但它也可以是任何其他对象,就像 SortedList 可以包含任何类型的对象一样。

例如。

unknownDatastructure structure = new unknownDatastructure<string, string>();
structure.add("left","the remainder after a removal");
structure.add("left","a direction opposite of right");
structure.add("right","a direction opposite of left");
structure.add("right","opposite of being wrong");

我想在调用时获取与搜索键匹配的对象数组,或者第一个条目(我可以通过索引找到剩余的)。

例如。

List<string> results = structure.FindAll("Left");

List 将包含实际引用的对象,在本例中为“移除的剩余部分”和“与右相反的方向”。

int firstmatch = structure.FindIndex("Right");

int 为 2(0 = 左一,1 = 左二,2 = 右一,3 = 右二)。我不在乎2左或2右的排序,只需要能够定位第一个repeat的条目,然后我可以根据需要向前遍历所有条目以创建“FindAll”功能

【问题讨论】:

    标签: c# data-structures


    【解决方案1】:

    Dictionary&lt;K,V&gt; 不支持重复键。您必须维护每个键的所有条目的列表:

    Dictionary<string, List<string>>
    

    【讨论】:

    • 感谢您指出对我来说显而易见的... 1 个条目,让该条目成为所有匹配项的列表。然后找出存储这些列表的结构。 :)
    【解决方案2】:

    只需创建您自己的:

    Dictionary<TKey, List<TValue>> dictionary;
    

    那么你的代码看起来有点像:

    List<TValue> list;
    if(!dictionary.TryGetValue(key, out list))
    {
      list = new List<TValue>();
      dictionary[key] = list;
    }
    
    list.Add("whatever...");
    

    【讨论】:

    • 我不确定我是否理解这段代码。将您的回复添加为书签,以便稍后阅读未知功能。感谢您的帮助。
    • 不用担心......这个想法是,TryGetValue() 将返回 true,前提是它已经拥有密钥。否则它将返回false。这允许您仅在需要时创建新的List&lt;&gt;
    【解决方案3】:

    您可以查看TupleAnonymous Types

    您是否有任何理由不想创建一个类或结构来包含您的数据?它可以让您在以后轻松添加功能。

    将以上任何一项添加到List&lt;T&gt; 将让您通过使用谓词找到元素。 myList.FindAll(x =&gt; x.MyKey == "left");

    【讨论】:

    • 我已经有一个对象类(第二个值)需要引用,并希望在标准类中为这些对象找到一个好的存储结构。我将使用 List 来存储类似的对象,现在使用 SortedList 来存储这些列表。 :)
    • @Taoh 我想我错过了你需要字典的重点。并不是说您不需要它,但您似乎可以通过坚持使用单个列表来完成示例中所需的一切。 LINQ 和谓词允许对您的集合进行各种搜索。
    • 我想我只是不清楚我的问题。我有一堆对象,它们有 1 个引用名称,但多个对象可以有相同的引用名称。我需要能够快速(而不是遍历所有对象)找到引用名称为 X 的所有对象。我不知道如何使用 Dictionary,所以我需要阅读它。最坏的情况是我学到了一些新东西:)
    猜你喜欢
    • 1970-01-01
    • 2013-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    • 1970-01-01
    • 2013-06-03
    • 2012-04-24
    相关资源
    最近更新 更多