【问题标题】:Sorting , searching a dictionary in C#排序,在 C# 中搜索字典
【发布时间】:2011-09-16 11:11:06
【问题描述】:

我有一本字典,字典 listOfProducts。 这个 listOfProducts 可以有数百种产品。 字符串键是产品编号 我想通过产品编号(key)获取一些特定的产品, 我有一个键列表,例如64290,64287,59261,50990,50975,50897,68494,68495,51015,68493 生成的字典应该只有具有上述键且顺序相同的项目, 知道我该怎么做。 ? 有没有什么订单数据结构可以更好地在这种场景下工作?

这是完整的场景:

这里是完整的场景:我从服务器获取一个带有产品信息的 xml 这个 XML 的格式是

<key>64285</key><string>productname[SEPERATOR]product description</string>  <key>64285</key><string>productname[SEPERATOR]product description</string><key>64285</key><string>productname[SEPERATOR]product description</string>

现在此 XML 不包含所有产品详细信息(例如,此产品没有 Product Rating 或 Product Color) 我需要按产品评级和产品颜色进行排序和搜索。 为此,我得到了另一个 XMl,其中包含按评级订购的产品密钥。

<dict>  <key>rating</key>   <string>64285,68495,68494,64228,68491.......</string> <key>price</key>   <string>68493,64234,50863,64236,64223,....</string> </dict>

类似我必须搜索颜色为“白色”的产品 为此,我得到 XMl 列表中的白色产品,

【问题讨论】:

    标签: .net windows-phone-7 c#-4.0 dictionary


    【解决方案1】:

    字典没有顺序。也许您可以创建一个按顺序包含元素的列表。

    List<Product> result = new List<Product>();
    var keys = new [] {64290,64287,59261,50990,50975,50897,68494,68495,51015,68493};
    foreach (var key in keys)
    {
        result.Add(listOfProducts[key]);
    }
    return result;
    

    【讨论】:

    • 感谢 Sjoerd,但我正在寻找一些内置方法?我的意思是使用 LINQ 或其他一些技术
    • var 结果 = keys.Select(key => listOfProducts[key]).ToList();
    【解决方案2】:

    您可以使用单独的数组/列表var keyList = new List&lt;int&gt;(); 按您想要的顺序存储键,这样您就可以遍历keyList 并在原始字典中查找值。

    【讨论】:

      【解决方案3】:

      你看过SortedDictionary吗?

      另外,我认为您不能依赖字典中项目的顺序,但您可以在对象中实现 IComparableIComparer 接口,然后使用它们进行排序和搜索。

      或尝试队列?

      您能否在问题的上下文中添加更多细节,如果我们知道您为什么要尝试实现您的要求,我会更容易。

      【讨论】:

      • 抱歉,您的意思是按照您在问题中的确切顺序吗?
      • 这行不通。键有特定的顺序,但没有排序。
      • 是的,我是这么认为的。我认为您需要使用不同的数据结构。我已经更新了我的答案。如果您希望它们按特定顺序排列,我认为您需要使用列表或队列。
      【解决方案4】:

      我相信 Lookup 可能是您正在寻找的集合,因为您将一个键映射到许多可能的值(如果我没看错的话)。

      在创建查找或从中检索值时,您可以根据需要对条目进行排序。

      编辑:

      这是一个例子:

      var Products = new [] 
      {
          new { Key = "64290", Name = "P1" },
          new { Key = "64290", Name = "P2" },
          new { Key = "64287", Name = "P3" },
          new { Key = "59261", Name = "P4" },
          new { Key = "59261", Name = "P5" },
          new { Key = "64290", Name = "P6" },
          new { Key =" 64290", Name = "P7" },
          new { Key = "51015", Name = "P8" },
          new { Key = "51015", Name = "P9" }
      };
      
      Lookup<string,string> products = ( Lookup<string,string> ) Products.ToLookup
      (
          p => p.Key, p => p.Name
      );
      
      foreach( IGrouping<string,string> g in products )
      {
          Console.WriteLine( g.Key );
      
          foreach( string product in g )
          {
              Console.WriteLine( String.Concat( "\t", product ) );
          }
      }
      

      输出:

      64290 P1 P2 P6 P7 64287 P3 59261 P4 P5 51015 P8 P9

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-22
        • 1970-01-01
        • 1970-01-01
        • 2020-10-18
        • 2011-10-18
        • 1970-01-01
        • 2015-08-13
        • 1970-01-01
        相关资源
        最近更新 更多