代码之家  ›  专栏  ›  技术社区  ›  Gabe

从字典中分配最大值

  •  1
  • Gabe  · 技术社区  · 14 年前

    我需要将一个小字典集合(10个项目)中的值分配给一个较大数量(大约20到30个)的DropDownList(在其Selected Value属性中)。

    具体来说,我需要 钥匙 最大值 在字典中,将其分配给第一个DropDownList.Selected值。 然后取第二个最大值的键,将其分配给第二个DropDownList。 当我浏览字典中的所有键/值时(还有DropDownlist需要分配),我需要使用字典中max值的键从顶部开始。

    我可以这样得到最大值的键。

    var maxKey = 
        results
        .Aggregate((left, right) => left.Value > right.Value ? left : right).Key;
    
    ddlItem.SelectedValue = maxKey.ToString();
    

    我最初做的是,在分配MaxValue之后移除它。但我忘了DropDownlist的数量会比实际字典的值多。我猜解决方案是使用一个不同的临时集合并使用它?感谢您的帮助。

    如果需要使用列表,如何将字典传输到列表并使用索引、键和值?

    3 回复  |  直到 14 年前
        1
  •  2
  •   Winston Smith    14 年前

    你可以使用 OrderByDescending 按值降序获取键值对,例如

    var d = new Dictionary<int, string>();
    var orderedKeyValuePairs = d.OrderByDescending(kvp => kvp.Value);
    

    在这个例子中, orderedKeyValuePairs 是一个 IOrderedEnumerable<KeyValuePair<int, string>>

    为了方便分配下拉列表,可以创建一个实用程序类,该类包装一个队列,如下所示:

    public class KVPCycle
    {
       Queue<KeyValuePair<int, string>> queue; 
    
       public KVPCycle(IEnumerable<KeyValuePair<int, string>> items)
       {
           queue = new Queue<KeyValuePair<int, string>>(items);
       }
    
       public KeyValuePair<int, string> Next()
       {
        var item = queue.Dequeue();
        queue.Enqueue(item);
        return item;
       }
    
    }
    

    您可以这样使用它:

    var cycle = new KVPCycle(d.OrderByDescending(kvp => kvp.Value));
    
    // Loop over your dropdown lists
    for each dropdown list
    
        var kvp = cycle.Next();
    
        // Get the key
        int key = kvp.Key;
    
        // Get the value
        string val = kvp.Value;
    
        // Now assign to your dropdown
        // ...
    

    这样,一旦您到达排序列表的末尾,您将自动再次回到开始位置-值在一个循环中旋转。

        2
  •  1
  •   Steven Sudit    14 年前

    是否尝试创建按值排序(desc)的键的IEnumerable?

    编辑

    最简单的方法是:

    var seq = d.OrderByDescending(kvp => kvp.Value).Select(kvp => kvp.Key);
    

    这个 d 是你的 Dictionary<string,int> . 这个 OrderByDescending 通过减小值和 Select 从对中提取密钥。结果是 IEnumerable<string> 按照你想要的顺序。

    此时,您可以运行 foreach 或者我想你也可以把它装进 Queue ,如另一个示例所示。

    (以上也可以用更SQL的语法来完成,但我没有看到这一点。)

        3
  •  0
  •   Kieren Johnstone    14 年前

    应该按降序对列表排序,然后可以按索引将第一个值赋给第一个控件,将第二个值赋给第二个控件,依此类推。

    希望有帮助!