从字典中分配最大值

时间:2010-07-21 15:49:37

标签: c# linq

我需要将小字典集合中的值(10个项目)分配给所选值属性中较大数量(约20到30个)的下拉列表。

具体来说,我需要在字典中获取 max value ,并将其分配给第一个dropdownlist.selected值。 然后取第二个最高值的键,将其分配给第二个下拉列表。 当我浏览字典中的所有键/值(并且仍然需要分配下拉列表)时,我需要使用字典中最大值的键从顶部开始。

我能够得到最大值的关键字。

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

ddlItem.SelectedValue = maxKey.ToString();

我原来做的是,我在分配后删除了maxvalue。但我忘了会有比实际字典值更多的下拉列表。我猜测解决方案是使用不同的临时集合并使用它?任何帮助表示赞赏。

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

3 个答案:

答案 0 :(得分:2)

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

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

在此示例中,orderedKeyValuePairsIOrderedEnumerable<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
    // ...

通过这种方式,一旦你到达有序列表的末尾,你将自动重新开始 - 值会循环旋转。

答案 1 :(得分:1)

您是否尝试创建按值排序(DESC)的IEnumerable密钥?

修改

最简单的方法是:

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

d是您的Dictionary<string,int>OrderByDescending通过递减值对键值对进行排序,Select从对中提取键。结果是IEnumerable<string>完全按照您想要的顺序。

此时,您可以在其上运行foreach,或者我想您也可以将其加载到Queue中,如另一个示例所示。

(以上也可以用更多SQL-ish语法完成,但我没有看到重点。)

答案 2 :(得分:0)

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

希望有所帮助!